ITPub博客

首页 > 数据库 > > 9.1 Literal Values

9.1 Literal Values

作者:飘絮絮絮丶 时间:2020-05-12 11:31:06 0 删除 编辑

参考官方文档:

dev.mysql.com/doc/refma


本节介绍如何在MySQL中编写字面值。 这些包括字符串,数字,十六进制和位值,布尔值和NULL。 本节还介绍了在MySQL中处理这些基本类型时可能遇到的各种细微差别。



9.1.1 字符串文字


字符串是包含在单引号(')或双引号(“)字符中的字节或字符序列。例如:

'a string'

"another string"


被引用的字符串彼此相邻,并连接到单个字符串。 以下几行是等同的:


'a string'

'a' ' ' 'string'



如果启用了ANSI_QUOTES SQL模式,则字符串文字只能在单引号内引用,因为在双引号内引用的字符串被解释为标识符。



二进制字符串是一串字节。 每个二进制字符串都有一个名为 binary的字符集和collation。 非二进制字符串是一串字符。 它具有binary 以外的字符集和与字符集兼容的排序规则。



对于这两种类型的字符串,比较都基于字符串单元的数值。 对于二进制字符串,单位是字节; 比较使用数字字节值。 对于非二进制字符串,单位是字符,有些字符集支持多字节字符; 比较使用数字字符代码值。 字符代码排序是字符串整理的函数。



字符串文字可能有一个可选的字符集introducer和COLLATE子句,以将其指定为使用特定字符集和 collation的字符串:

[_charset_name]'string' [COLLATE collation_name]



例子:

SELECT _latin1'string';

SELECT _binary'string';

SELECT _utf8'string' COLLATE utf8_danish_ci;



您可以使用N'literal'(或n'literal')在国家字符集中创建一个字符串。 这些陈述是等同的:


SELECT N'some text';

SELECT n'some text';

SELECT _utf8'some text';

有关这些字符串语法形式的信息,请参见第10.3.7节“国家字符集”和第10.3.8节。



在字符串中,除非启用了NO_BACKSLASH_ESCAPES SQL模式,否则某些序列具有特殊含义。 这些序列中的每一个都以反斜杠(\)开头,即反转字符。 MySQL识别表9.1“特殊字符转义序列”中显示的转义序列。 对于所有其他转义序列,将忽略反斜杠。 也就是说,转义字符被解释为没有被转义。 例如,\x只是x。 这些序列是区分大小写的。 例如,\b被解释为退格,但\B被解释为B.退出处理根据由character_set_connection系统变量指示的字符集来完成。 即使对于位于介绍者之前的字符串也是如此,该字符串指示不同的字符集,如第10.3.6节“字符串文字字符集和校对”中所述。



表9.1特殊字符转义序列

Escape Sequence Character Represented by Sequence

\0 An ASCII NUL (X'00') character

\' A single quote (') character

\" A double quote (") character

\b A backspace character

\n A newline (linefeed) character

\r A carriage return character

\t A tab character

\Z ASCII 26 (Control+Z); see note following the table

\\ A backslash (\) character

\% A % character; see note following the table

\_ A _ character; see note following the table



ASCII 26字符可以编码为\Z,以使您能够解决Windows上代码为ASCII 26的问题。 如果您尝试使用mysql db_name <file_name,则文件中的ASCII 26会导致问题。



\%和\_序列用于在模式匹配上下文中搜索%和_的文字实例,否则它们将被解释为通配符。 请参见第12.5.1节“字符串比较函数”中关于LIKE运算符的描述。 如果您在模式匹配上下文之外使用\%或\ _,则它们评估为字符串\%和\ _,而不是%和_。



有几种方法可以在字符串中包含引号字符:

  • 在'中的被引起来的'可以被写成''
  • 在"中的被引起来的'可以被写成""
  • 在引号字符前加上一个转义字符(\)。
  • 在'号中的"不需要特殊处理,不需要加倍或逃脱。同样,在"中的'号不需要特殊处理。


以下SELECT语句演示了引号和转义如何工作:



mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';

+-------+---------+-----------+--------+--------+

| hello | "hello" | ""hello"" | hel'lo | 'hello |

+-------+---------+-----------+--------+--------+

mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";

+-------+---------+-----------+--------+--------+

| hello | 'hello' | ''hello'' | hel"lo | "hello |

+-------+---------+-----------+--------+--------+

mysql> SELECT 'This\nIs\nFour\nLines';

+--------------------+

| This

Is

Four

Lines |

+--------------------+

mysql> SELECT 'disappearing\ backslash';

+------------------------+

| disappearing backslash |

+------------------------+



要将二进制数据插入到字符串列(例如BLOB列)中,您应该使用转义序列表示某些字符。 反斜杠(\)和用于引用字符串的引号字符必须转义。 在某些客户端环境中,可能还需要转义NUL或Control + Z。 如果没有转义,mysql客户端会截断包含NUL字符的带引号的字符串,如果没有转义,则在Windows上使用Control + Z作为END-OF-FILE。



在编写应用程序时,在将字符串用作发送到MySQL服务器的SQL语句中的数据值之前,必须正确地转义任何可能包含任何这些特殊字符的字符串。 你可以通过两种方式来做到这一点:


  • 使用转义特殊字符的函数处理字符串。 在C程序中,您可以使用mysql_real_escape_string_quote()C API函数来转义字符。 请参见第27.8.7.56节“mysql_real_escape_string_quote()”。 在构造其他SQL语句的SQL语句中,可以使用QUOTE()函数。 Perl DBI接口提供了一种引用方法来将特殊字符转换为正确的转义序列。 请参见第27.10节“MySQL Perl API”。 其他语言接口可能会提供类似的功能。
  • 作为显式转义特殊字符的替代方法,许多MySQL API提供了一个占位符功能,使您能够将特殊标记插入到语句字符串中,然后在发出语句时将数据值绑定到它们。 在这种情况下,API会负责为您转义值中的特殊字符。





9.1.2 数值文本


数字文字包括精确值(整数和DECIMAL)文字和近似值(浮点)文字。


整数表示为一系列数字。 数字可能包括。 作为小数分隔符。 数字可以前面有 - 或+分别表示负值或正值。 用尾数和指数以科学计数法表示的数字是近似值数字。


精确值数字文字具有整数部分或小数部分,或两者兼有。 他们可能会有符号。 例如:1,.2,3.4,-5,-6.78,+9.10。



近似值数字文字以科学记数法以尾数和指数表示。 其中一个或两个部分都可以有正负。 例子:1.2E3,1.2E-3,-1.2E3,-1.2E-3。



两个看起来相似的数字可能会有所不同。 例如,2.34是精确值(固定点)数字,而2.34E0是近似值(浮点)数字。



DECIMAL数据类型是一个定点类型,计算是精确的。 在MySQL中,DECIMAL类型有几个同义词:NUMERIC,DEC,FIXED。 整数类型也是精确值类型。


FLOAT和DOUBLE数据类型是浮点类型,计算是近似的。 在MySQL中,与FLOAT或DOUBLE同义的类型是DOUBLE PRECISION和REAL。


一个整数可以用在浮点上下文中; 它被解释为等价的浮点数。




9.1.3 日期和时间文字


日期和时间值可以用多种格式表示,例如带引号的字符串或数字,具体取决于值的确切类型和其他因素。 例如,在MySQL预期日期的上下文中,它将'2015-07-21','20150721'和20150721中的任何一个解释为日期。




标准SQL和ODBC日期和时间文字。


标准SQL允许使用类型关键字和字符串来指定时间文字。 关键字和字符串之间的空格是可选的。


DATE 'str'

TIME 'str'

TIMESTAMP 'str'


MySQL可以识别这些结构以及相应的ODBC语法:


{ d 'str' }

{ t 'str' }

{ ts 'str' }



MySQL使用type关键字,并且这些结构分别产生DATE,TIME和DATETIME值,包括尾随小数部分(如果指定)。 TIMESTAMP语法在MySQL中产生一个DATETIME值,因为DATETIME的范围更接近于标准SQL TIMESTAMP类型,该类型的年范围从0001到9999。(MySQL TIMESTAMP的年份范围是1970到2038年。)



日期和时间上下文中的字符串和数字文字。

MySQL以这些格式识别DATE值:

  • 作为'YYYY-MM-DD'或'YY-MM-DD'格式的字符串。 允许使用“宽松”的语法:任何标点字符都可以用作日期部分之间的分隔符。 例如,'2012-12-31','2012/12/31','2012^12^31'和'2012@12@31'等同。
  • 作为不带'YYYYMMDD'或'YYMMDD'格式的分隔符的字符串,前提是该字符串作为日期有意义。 例如,'20070523'和'070523'被解释为'2007-05-23',但'071332'是非法的(它具有无意义的月份和日期部分)并且变成'0000-00-00'。
  • 作为YYYYMMDD或YYMMDD格式的数字,只要该数字作为日期有意义。 例如,19830905和830905被解释为“1983-09-05”。


MySQL以这些格式识别DATETIME和TIMESTAMP值:

  • 作为'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS'格式的字符串。 这里也允许使用“宽松”的语法:任何标点字符都可以用作日期部分或时间部分之间的分隔符。 例如,'2012-12-31 11:30:45','2012^12^31 11+30+45','2012/12/31 11*30*45'和'2012@12@31 11^30^45'是等同的。


日期和时间部分和小数部分之间唯一标识的分隔符是小数点。


日期和时间部分可以用T分隔而不是空格。 例如,'2012-12-31 11:30:45''2012-12-31T11:30:45'是等同的。


  • 作为不带''YYYYMMDDHHMMSS''或'YYMMDDHHMMSS'格式的分隔符的字符串,前提是该字符串作为日期有意义。 例如,'20070523091528'和'070523091528'被解释为'2007-05-23 09:15:28',但是'071122129015'是非法的(它具有无意义的微小部分)并且变成'0000-00-00 00:00:00'。


DATETIME或TIMESTAMP值可以包含最大微秒(6位数)精度的尾随小数秒部分。 小数部分应始终与其余时间分开小数点; 其他小数分隔符不能被识别


包含两位数年份值的日期含糊不清,因为该世纪未知。 MySQL使用这些规则解释两位数年份值:

  • 在70-99范围内的年份值被转换为1970-1999。
  • 00-69范围内的年份值将转换为2000-2069。



对于指定为包含日期部分分隔符的字符串的值,不必为小于10的月份或日期值指定两位数字。“2015-6-9”与“2015-06-09”相同。 同样,对于指定为包含时间部分分隔符的字符串的值,不需要为小于10的小时,分钟或秒值指定两位数。'2015-10-30 1:2:3'与 '2015-10-30 01:02:03'相同。



指定为数字的值应该是6,8,12或14位数字。 如果一个数字的长度是8位或14位,则它被假定为YYYYMMDD或YYYYMMDDHHMMSS格式,并且年份由前4位数字给出。 如果数字长度为6或12位数字,则假定为YYMMDD或YYMMDDHHMMSS格式,并且年份由前两位数字给出。 不是这些长度之一的数字被解释为用前导零填充到最近的长度。



指定为非限定字符串的值根据其长度进行解释。 对于长度为8或14个字符的字符串,假定年份由前4个字符给出。 否则,假定年份由前2个字符给出。 该字符串从左到右被解释为查找年份,月份,日期,小时,分钟和秒值,以获取字符串中存在的部分数量。 这意味着你不应该使用少于6个字符的字符串。 例如,如果您指定代表1999年3月的'9903',MySQL会将其转换为“零”日期值。 发生这种情况是因为年和月的值是99和03,但是一天的部分完全没有。 但是,您可以明确指定零值来表示丢失的月份或日期部分。 例如,要插入值“1999-03-00”,请使用“990300”。


MySQL以这些格式识别TIME值:

  • 作为'D HH:MM:SS'格式的字符串。 您还可以使用以下“放松”语法之一:'HH:MM:SS','HH:MM','D HH:MM','D HH'或'SS'。 这里D表示日期,可以有一个从0到34的值。
  • 作为一个没有'HHMMSS'格式的分隔符的字符串,只要它有一定的时间意义。 例如,'101112'被理解为'10:11:12',但是'109712'是非法的(它具有无意义的微小部分)并且变成'00:00:00'。
  • 作为HHMMSS格式的一个数字,只要它有意义。 例如,101112被理解为'10:11:12'。 还了解以下备选格式:SS,MMSS或HHMMSS。


在“D HH:MM:SS.fraction”,“HH:MM:SS.fraction”,“HHMMSS.fraction”和HHMMSS.fraction时间格式中识别尾随小数秒部分,其中分数是小数部分 达到微秒(6位)精度。 小数部分应始终与其余时间用小数点分开; 没有其他分隔符被识别。


对于指定为包含时间部分定界符的字符串的TIME值,不需要为小于10的小时,分钟或秒值指定两位数字。'8:3:2'与'08:03:02'等价。




9.1.4 16进制文字


十六进制文字值使用X'val'或0xval表示法写入,其中val包含十六进制数字(0..9,A..F)。 数字和任何前导X的大小写无关紧要。 前导0x是区分大小写的,不能写为0X。


合法的十六进制文字:

X'01AF'

X'01af'

x'01AF'

x'01af'

0x01AF

0x01af


非法的十六进制文字:


X'0G' (G is not a hexadecimal digit)

0X01AF (0X must be written as 0x)



使用X'val'符号写入的值必须包含偶数个数字或发生语法错误。 要解决该问题,请使用前导零填充该值:


mysql> SET @s = X'FFF';

ERROR 1064 (42000): You have an error in your SQL syntax;

check the manual that corresponds to your MySQL server

version for the right syntax to use near 'X'FFF''

mysql> SET @s = X'0FFF';

Query OK, 0 rows affected (0.00 sec)



使用包含奇数个数字的0xval符号写入的值被视为具有额外的前导0.例如,0xaaa被解释为0x0aaa。


默认情况下,十六进制文字是一个二进制字符串,其中每对十六进制数字表示一个字符:


mysql> SELECT X'4D7953514C', CHARSET(X'4D7953514C');

+---------------+------------------------+

| X'4D7953514C' | CHARSET(X'4D7953514C') |

+---------------+------------------------+

| MySQL | binary |

+---------------+------------------------+

mysql> SELECT 0x5461626c65, CHARSET(0x5461626c65);

+--------------+-----------------------+

| 0x5461626c65 | CHARSET(0x5461626c65) |

+--------------+-----------------------+

| Table | binary |

+--------------+-----------------------+


十六进制文字可能有一个可选的字符集介绍者和COLLATE子句,以将其指定为使用特定字符集和 collation的字符串:


[_charset_name] X'val' [COLLATE collation_name]


例如:


SELECT _latin1 X'4D7953514C';

SELECT _utf8 0x4D7953514C COLLATE utf8_danish_ci;


这些示例使用X'val'符号,但是0xval符号也允许作为引入者。 有关介绍人的信息,请参见第10.3.8节“字符集介绍人”。


在数值上下文中,MySQL将像BIGINT(64位整数)那样处理十六进制文字。 为确保数字处理十六进制文字,请在数字上下文中使用它。 这样做的方法包括添加0或使用CAST(... AS UNSIGNED)。 例如,默认情况下,分配给用户定义变量的十六进制文字是二进制字符串。 要将该值指定为数字,请在数字上下文中使用它:

mysql> SET @v1 = X'41';

mysql> SET @v2 = X'41'+0;

mysql> SET @v3 = CAST(X'41' AS UNSIGNED);

mysql> SELECT @v1, @v2, @v3;

+------+------+------+

| @v1 | @v2 | @v3 |

+------+------+------+

| A | 65 | 65 |

+------+------+------+


一个空的十六进制值(X'')计算为一个零-长度的二进制字符串。 转换为数字,它会生成0:


mysql> SELECT CHARSET(X''), LENGTH(X'');

+--------------+-------------+

| CHARSET(X'') | LENGTH(X'') |

+--------------+-------------+

| binary | 0 |

+--------------+-------------+

mysql> SELECT X''+0;

+-------+

| X''+0 |

+-------+

| 0 |

+-------+



X'val'符号基于标准SQL。 0x表示法基于ODBC,通常使用十六进制字符串为BLOB列提供值。


要将字符串或数字转换为十六进制格式的字符串,请使用HEX()函数:

mysql> SELECT HEX('cat');

+------------+

| HEX('cat') |

+------------+

| 636174 |

+------------+

mysql> SELECT X'636174';

+-----------+

| X'636174' |

+-----------+

| cat |

+-----------+





9.1.5 位-值文字


位值文字使用b'val'或0bval表示法编写。 val是使用零和1写入的二进制值。 任何前导b的大小写无关紧要。 前导0b区分大小写,不能写为0B。


合法的bit值文字:

b'01'

B'01'

0b01



非法的bit值文字:

b'2' (2 is not a binary digit)

0B01 (0B must be written as 0b)



默认情况下,bit值文字是一个二进制字符串:


mysql> SELECT b'1000001', CHARSET(b'1000001');

+------------+---------------------+

| b'1000001' | CHARSET(b'1000001') |

+------------+---------------------+

| A | binary |

+------------+---------------------+

mysql> SELECT 0b1100001, CHARSET(0b1100001);

+-----------+--------------------+

| 0b1100001 | CHARSET(0b1100001) |

+-----------+--------------------+

| a | binary |

+-----------+--------------------+


位值字面值可以有一个可选的字符集introducer和COLLATE子句,以将其指定为使用特定字符集和 collation 的字符串:


[_charset_name] b'val' [COLLATE collation_name]


例子:


SELECT _latin1 b'1000001'; SELECT _utf8 0b1000001 COLLATE utf8_danish_ci;


这些例子使用b'val'符号,但是0bval符号也允许引入者。


在数值上下文中,MySQL将像位整型一样处理。 要确保位数字的数字处理,请在数字上下文中使用它。 这样做的方法包括添加0或使用CAST(... AS UNSIGNED)。 例如,默认情况下,分配给用户定义变量的位立即数是二进制字符串。 要将该值指定为数字,请在数字上下文中使用它:


mysql> SET @v1 = b'1100001';

mysql> SET @v2 = b'1100001'+0;

mysql> SET @v3 = CAST(b'1100001' AS UNSIGNED);

mysql> SELECT @v1, @v2, @v3;

+------+------+------+

| @v1 | @v2 | @v3 |

+------+------+------+

| a | 97 | 97 |

+------+------+------+


一个空的位值(b'')计算为一个零长度的二进制字符串。 转换为数字,它会生成0:

mysql> SELECT CHARSET(b''), LENGTH(b'');

+--------------+-------------+

| CHARSET(b'') | LENGTH(b'') |

+--------------+-------------+

| binary | 0 |

+--------------+-------------+

mysql> SELECT b''+0;

+-------+

| b''+0 |

+-------+

| 0 |

+-------+


bit值表示法可方便指定要分配给BIT列的值:


CREATE TABLE t (b BIT(8));

INSERT INTO t SET b = b'11111111';

INSERT INTO t SET b = b'1010';

INSERT INTO t SET b = b'0101';



结果集中的位值将作为二进制值返回,这可能无法很好地显示。 要将位值转换为可打印形式,请在数字上下文中使用它,或使用BIN()或HEX()等转换函数。 转换后的值不显示高位0位。


mysql> SELECT b+0, BIN(b), OCT(b), HEX(b) FROM t;




9.1.6 布尔类型文字


常量TRUE和FALSE分别评估为1和0。 常数名称可以用任何大小写字母书写。

mysql> SELECT TRUE, true, FALSE, false;

-> 1, 1, 0, 0




9.1.7 NULL 文字


NULL值表示“无数据”。NULL可以用任何大小写字母。 同义词是\ N(区分大小写)。 在SQL语句中,\N作为NULL的同义词的处理从MySQL 5.7.18开始已弃用,并且在MySQL 8.0中被删除; 改用NULL。


请注意,NULL值与数值类型的值0或字符串类型的空字符串不同。


对于使用LOAD DATA INFILE或SELECT ... INTO OUTFILE执行的文本文件导入或导出操作,NULL由\N序列表示。 请参见第13.2.6节“LOAD DATA INFILE语法”。 在文本文件中使用\N不受SQL语句中\N的弃用影响。



对于使用ORDER BY进行排序,NULL值在按升序排序的其他值之前进行排序,在按降序排序的其他值之后进行排序。


--oracle 相反 升序为无穷大,降序为无穷小。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3159304/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42398