Mysql-语法结构之字面量


在Mysql中,了解相关字面量及其相关元素的规则是有必要的。

字面量

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

字符串字面量

字符串是字节或字符序列,用单引号(’)或双引号(“)字符括起来。
彼此相邻的带引号的字符串被串联为单个字符串。

'this is a string value'
"this is a str"
'a string'
'a' ' ' 'string'

如果启用ANSI_QUOTES SQL模式,则字符串文字只能在单引号中引起来,因为双引号中引起来的字符串被解释为标识符。
二进制字符串是一串字节。每个二进制字符串都有一个名为binary的字符集和排序规则。非二进制字符串是一串字符。它有二进制以外的字符集和与字符集兼容的排序规则。
对于这两种类型的字符串,比较都是基于字符串单位的数值进行的。 对于二进制字符串,单位是字节。 比较使用数字字节值。 对于非二进制字符串,单位是字符,某些字符集支持多字节字符。 比较使用数字字符代码值。 字符代码排序是字符串排序规则的函数。
字符串文字可能具有可选的字符集介绍程序和COLLATE子句,以将其指定为使用特定字符集和排序规则的字符串:

[_charset_name]'string' [COLLATE collation_name]

查询:

mysql>select _latin1'string';select _binary'string';select _uf8'string' collate utf8_danish_ci;

在这里插入图片描述
可以使用N’literal’(或n’literal’)在国际字符集中创建字符串。

mysql>select n'some text';select N'some text';select _utf8'some text';

在这里插入图片描述
在字符串中,除非启用了NO_BACKSLASH_ESCAPES SQL模式,否则某些序列具有特殊含义。 这些序列中的每个序列都以反斜杠()开头,即转义字符。 MySQL可以识别特殊字符转义序列中所示的转义序列。 对于所有其他转义序列,将忽略反斜杠。 也就是说,将转义字符解释为好像没有转义。 例如,\x只是x。 这些序列区分大小写。 例如,\b被解释为退格,而\ B被解释为B。转义处理是根据character_set_connection系统变量指示的字符集完成的。 即使对于前面带有指示符(指示不同的字符集)的字符串,也是如此.
在这里插入图片描述
可以将ASCII 26字符编码为\Z,以使您能够解决ASCII 26在Windows上代表END-OF-FILE的问题.如果尝试使用mysql db_name < file_name,文件中的ASCII 26会导致问题。
\%和\ _序列用于在模式匹配上下文中搜索%和_的文字实例,否则它们将被解释为通配符。LIKE运算符,如果在模式匹配上下文之外使用\%或\ _,则它们的计算结果为字符串\%和\ _,而不是%和 _。
有几种在字符串中包含引号字符的方法:

  • 用引号引起来的字符串中的’可能写为’’。
  • 字符串中用“引起的“可以写为“”。
  • 在引号字符前加转义字符(\)。
  • 带有“的字符串内的’不需要特殊处理,不需要加倍或转义。以同样的方式,带有"的字符串内的’不需要特殊处理。
SELECT 'hello', '"hello"', '""hello""', 'hel''lo','\'hello';

在这里插入图片描述

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

在这里插入图片描述
换行转义:

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

在这里插入图片描述
空格:

mysql>select 'this\ black';

在这里插入图片描述
要将二进制数据插入字符串列,应使用转义序列表示某些字符。 反斜杠(\)和用于引号字符串的引号字符必须转义。 在某些客户端环境中,可能还需要转义NUL或Control+Z。 如果不进行转义,mysql客户端会截断包含NUL字符的引号字符串,如果不进行转义,则Windows上的END-OF-FILE可能会使用Control + Z。
在编写应用程序时,任何可能包含任何特殊字符的字符串都必须正确转义,然后才能将该字符串用作发送到MySQL服务器的SQL语句中的数据值。 可以通过两种方式执行此操作:

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

数值字面量

数字字面量包括精确值(整数和DECIMAL)字面量和近似值(浮点)字面量。
整数表示为数字序列, 数字可能包括.作为小数点分隔符,数字前面可以带有-或+表示负值或正值.用科学计数法表示的带有尾数和指数的数字是近似值数字。
精确值数字字面量具有整数部分或小数部分,或两者都有。
近似值数字文字以科学计数法表示,并带有尾数和指数。
看起来相似的两个数字可能会有所不同。
DECIMAL数据类型是定点类型,计算精确.在MySQL中,DECIMAL类型具有多个同义词:NUMERIC,DEC,FIXED.整数类型也是精确值类型.
FLOAT和DOUBLE数据类型是浮点类型,计算值是近似的。在MySQL中,与FLOAT或DOUBLE同义的类型是DOUBLE PRECISION和REAL.
在浮点上下文中可以使用整数.它被解释为等效的浮点数.

日期和时间字面量

日期和时间值可以用多种格式表示,例如带引号的字符串或数字,具体取决于值的确切类型和其他因素。
标准SQL和ODBC日期和时间字面量。 标准SQL要求使用type关键字和字符串指定时间字面量。 关键字和字符串之间的空格是可选的。

date 'str'
time 'str'
timestamp 'str'

MySQL可以识别,但是与标准SQL不同,它不需要type关键字。 要符合标准的应用程序应包括用于时间文字的type关键字。
MySQL还可以识别与标准SQL语法相对应的ODBC语法

{ d 'str' }
{ t 'str' }
{ ts 'str' }

MySQL使用type关键字和ODBC结构分别生成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’。
  • 作为数字,格式为YYYYMMDDhhmmss或YYMMDDhhmmss,但前提是该数字作为日期有意义。 例如,将19830905132800和830905132800解释为“ 1983-09-05 13:28:00”。
    DATETIME或TIMESTAMP值可以包含尾随的小数秒部分,精度最高为微秒(6位数).小数部分应始终与其余时间用小数点分隔;没有其他小数秒定界符被识别。
    包含两位数年份值的日期是不确定的,因为世纪是未知的。 MySQL使用以下规则解释两位数的年份值:
  • 70-99范围内的年值变为1970-1999
  • 00-69范围内的年份值变成2000-2069

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

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

指定为非定界字符串的值将根据其长度进行解释。 对于长度为8或14个字符的字符串,假定年份由前4个字符给出。否则,假定年份由前两个字符给出。 该字符串从左到右进行解释,以查找年,月,日,小时,分钟和秒的值,以查找字符串中存在的尽可能多的部分。 这意味着不应使用少于6个字符的字符串。 例如,如果指定“9903”(代表1999年3月),则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’等价。

十六进制字面量

十六进制文字值使用X’val’或0xval表示法编写,其中val包含十六进制数字(0…9,A…F)。数字的字母大小写和任何前导X都不重要。 前导0x区分大小写,不能写为0X。
使用X’val’表示法编写的值必须包含偶数个数字,否则会发生语法错误。 要解决此问题,需要在值前加上零:

mysql>set @s = X'FFF';

在这里插入图片描述

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

在这里插入图片描述
使用0xval表示法写入的包含奇数位数的值将被视为具有额外的前导0.例如,0xaaa被解释为0x0aaa。
默认情况下,十六进制文字是二进制字符串,其中每对十六进制数字代表一个字符:

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

在这里插入图片描述

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

在这里插入图片描述
十六进制字面量可能具有可选的字符集介绍程序和COLLATE子句,以将其指定为使用特定字符集和排序规则的字符串:

[_charset_name] X'val' [COLLATE collation_name]
mysql>select _latin1 X'4D7953514C';select _utf8 0x4D7953514C collate utf8_danish_ci;

在这里插入图片描述
在数字上下文中,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;

在这里插入图片描述
空的十六进制值(X’’)等于零长度的二进制字符串。转换为数字,它产生0.

mysql>select charset(X''),length(X'');

在这里插入图片描述
X’val’表示法基于标准SQL。 0x表示法基于ODBC,通常使用十六进制字符串为BLOB列提供值。
要将字符串或数字转换为十六进制格式的字符串,请使用HEX()函数:

mysql>select HEX('cat')

在这里插入图片描述
对于十六进制字面量,位操作被视为数字上下文,但是位操作允许在MySQL 8.0及更高版本中使用数字或二进制字符串参数。 要为十六进制文字显式指定二进制字符串上下文,可以对至少一个参数使用_binary引荐.

mysql> SET @v1 = X'000D' | X'0BC0';
mysql> SET @v2 = _binary X'000D' | X'0BC0';
mysql> SELECT HEX(@v1), HEX(@v2);

对于两个位操作,显示的结果看起来都相似,但是不带_binary的结果是BIGINT值,而带_binary的结果是二进制字符串。 由于结果类型的不同,显示的值也有所不同:数字结果不显示高阶0位数.

Bit-Value字面量

Bit-value 字面量使用b’val’0bval表示法编写。 val是使用零和一写入的二进制值。 任何前导b的字母大小写都没有关系。 前导0b区分大小写,不能写为0B。

b'01'
B'01'
0b01

默认情况下,Bit-value 字面量是二进制字符串

mysql> SELECT b'1000001', CHARSET(b'1000001');
+------------+---------------------+
| b'1000001' | CHARSET(b'1000001') |
+------------+---------------------+
| A          | binary              |
+------------+---------------------+
mysql> SELECT 0b1100001, CHARSET(0b1100001);
+-----------+--------------------+
| 0b1100001 | CHARSET(0b1100001) |
+-----------+--------------------+
| a         | binary             |
+-----------+--------------------+

Bit-value 字面量可能具有可选的字符集介绍程序和COLLATE子句,以将其指定为使用特定字符集和排序规则的字符串

[_charset_name] b'val' [COLLATE collation_name]

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

在数字上下文中,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-values 以二进制值形式返回,可能无法很好地显示。 要将位值转换为可打印形式,请在数字上下文中使用它,或使用诸如BI())或HEX()之类的转换函数。转换后的值中不显示高位0位数。

mysql> SELECT b+0, BIN(b), OCT(b), HEX(b) FROM t;
+------+----------+--------+--------+
| b+0  | BIN(b)   | OCT(b) | HEX(b) |
+------+----------+--------+--------+
|  255 | 11111111 | 377    | FF     |
|   10 | 1010     | 12     | A      |
|    5 | 101      | 5      | 5      |
+------+----------+--------+--------+

对于Bit-values字面量,位操作被视为数字上下文,但是位操作允许在MySQL 8.0及更高版本中使用数字或二进制字符串参数。 要为位文字明确地指定二进制字符串上下文,请对至少一个参数使用_binary引荐:

mysql> SET @v1 = b'000010101' | b'000101010';
mysql> SET @v2 = _binary b'000010101' | _binary b'000101010';
mysql> SELECT HEX(@v1), HEX(@v2);
+----------+----------+
| HEX(@v1) | HEX(@v2) |
+----------+----------+
| 3F       | 003F     |
+----------+----------+

Boolean字面量

常数TRUE和FALSE分别取值为1和0。 常量名称可以用任何字母大写

mysql> SELECT TRUE, true, FALSE, false;

在这里插入图片描述

NULL值

NULL值表示“无数据”。 NULL可以用任何字母大写。
请注意,NULL值不同于数字类型的值,例如0或字符串类型的空字符串。
对于使用LOAD DATA或SELECT … INTO OUTFILE执行的文本文件导入或导出操作,\N序列表示NULL。
对于使用ORDER BY进行排序,NULL值将在其他值之前进行升序排序,在其他值之后进行降序排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值