字符串是包含在单引号(')或双引号(")字符中的字节或字符序列。 以下几行例子是等同的:
'a string'
"a string"
'a' ' ' 'string'
如果ANSI_QUOTES
启用了SQL模式,则字符串文字只能在单引号内引用,因为在双引号内引用的字符串被解释为标识符。
binary
的字符集和排序规则。对于这两种类型的字符串,比较都是基于字符串单元的数值。 对于二进制字符集,单位是字节,使用字节值进行比较; 对于非二进制字符集,单位是字符和字符集支持多字节字符,使用数值进行比较;
一个字符串文字可以有一个可选的字符集introducer和COLLATE clause,用来指定它是一个使用特定字符集和排序规则的字符串:
[_charset_name]'string' [COLLATE collation_name]
// 例子
SELECT _latin1'string';
SELECT _binary'string';
SELECT _utf8'string' COLLATE utf8_danish_ci;
在一个字符串中,某些序列具有特殊的含义,除非NO_BACKSLASH_ESCAPES
启用了SQL模式。这些序列中的每一个都以反斜杠(\
)开始,称为转义字符。
image.png
这些%
和_
序列用于搜索模式匹配上下文中的文字实例,%
与_
解释为通配符。
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 |
+------------------------+
在编写应用程序时,任何可能包含任何这些特殊字符的字符串必须在将该字符串用作发送到MySQL服务器的SQL语句中的数据值之前正确转义。
你可以通过两种方式来做到这一点:
数字文字包括精确值(整数)和 DECIMAL
文字和近似值(浮点)文字。
FLOAT
与DOUBLE
是浮点类型,其计算结果是近似值。
日期和时间值可以用多种格式表示,例如带引号的字符串或数字,具体取决于值的确切类型和其他因素。
MySQL使用type关键字,并且这些结构分别生成 DATE
, TIME
和 DATETIME
值,如果指定,则包括尾随小数秒部分。该 TIMESTAMP
语法产生 DATETIME
在MySQL的价值,因为 DATETIME
有更紧密地对应于标准SQL的范围 TIMESTAMP
类型,其中有一年范围0001
到9999
。(MySQL的TIMESTAMP
年份范围是1970
到2038
。)
MySQL识别日期/时间比较宽松,通常符合日期/时间规则的都可以被转化成功,具体可以参考链接:https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html。
SELECT HEX('MySQL'),0x4D7953514C,x'4D7953514C',X'4D7953514C'
默认情况下,十六进制文字是一个二进制字符串,其中每对十六进制数字表示一个字符。
MySQL 中的某些对象,包括数据库,表,索引,列,别名,视图,存储过程,分区,表空间以及其他对象名称都被称为标识符。
Unicode
字符,他们通常包括以下字符:
标识符的引号字符是反引号(`):
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
若
ASNI_QUOTES
启用了SQL模式,则可以使用双引号引用标识符。该ANSI_QUOTES
模式使服务器将双引号字符串解释为标识符。因此,启用此模式时,字符串文字必须包含在单引号内。它们不能用双引号括起来。
在查询的SELECT列表中,可以使用标识符或字符串引用字符指定引用的列别名:
mysql> SELECT 1 AS `one`, 2 AS 'two';
不建议在命名使使用数字+英文+数字
格式命名,因为这样可能会造成模糊不清的语意。举例:1e+3
。
小心使用MD5()
生成表名,因为会产生上一条的问题。
下表描述了每种标识符的最大长度:
标识符 | 最大长度(字符) |
---|---|
Database | 64 |
Table | 64 |
Column | 64 |
Index | 64 |
Constraint | 64 |
Stored Program | 64 |
View | 64 |
Tablespace | 64 |
Server | 64 |
Log File Group | 64 |
Alias | 256 |
Compound Statement Label | 16 |
User-Defined Variable | 64 |
标识符可能合格或不合格。一个在上下文环境中可以正确推断无歧义的标识符是被允许的。限定名称至少包含一个限定符,通过重写默认上下文或提供缺失上下文来阐明解释上下文。
例如,该语句使用不限定名称t1创建一个表:
CREATE TABLE t1 (i INT);
因为t1
未指明数据库,所以该次查询使用当前默认的数据库。如果当前未有默认数据库,则会抛出错误。
使用限定名db1.t1
创建一个表:
CREATE TABLE db1.t1 (i INT);
因为已经指明了使用数据库db1
,所以会在db1
中创建表t1
。如果不存在默认数据库,则必须指定数据库限定符。
如果存在默认数据库,且就是要使用的数据库,则可不指定数据库限定符(不推荐)。
如果存在默认数据库,但与要使用的不同,则必须指定数据库限定符。
限定符具备以下特征:
.
分隔。tbl_name.col_name
与tbl_name . col_name
是等价的。标识符是区分大小写的,具体详情参照这里。
对于非保留的关键字可不使用引号,对于保留的关键字得使用引号。
mysql> CREATE TABLE `interval` (begin INT, end INT);
BEGIN
并且END
是关键字但不保留,所以它们作为标识符的使用不需要引用。INTERVAL
是一个保留关键字,必须用引号将其用作标识符。
避免使用保留字,避免因为语意含糊不清引发的问题。
保留字的清单可以在这里轻松查询到。
expr:
expr OR expr
| expr || expr
| expr XOR expr
| expr AND expr
| expr && expr
| NOT expr
| ! expr
| boolean_primary IS [NOT] {TRUE | FALSE | UNKNOWN}
| boolean_primary
boolean_primary:
boolean_primary IS [NOT] NULL
| boolean_primary <=> predicate
| boolean_primary comparison_operator predicate
| boolean_primary comparison_operator {ALL | ANY} (subquery)
| predicate
comparison_operator: = | >= | > | <= | < | <> | !=
predicate:
bit_expr [NOT] IN (subquery)
| bit_expr [NOT] IN (expr [, expr] ...)
| bit_expr [NOT] BETWEEN bit_expr AND predicate
| bit_expr SOUNDS LIKE bit_expr
| bit_expr [NOT] LIKE simple_expr [ESCAPE simple_expr]
| bit_expr [NOT] REGEXP bit_expr
| bit_expr
bit_expr:
bit_expr | bit_expr
| bit_expr & bit_expr
| bit_expr << bit_expr
| bit_expr >> bit_expr
| bit_expr + bit_expr
| bit_expr - bit_expr
| bit_expr * bit_expr
| bit_expr / bit_expr
| bit_expr DIV bit_expr
| bit_expr MOD bit_expr
| bit_expr % bit_expr
| bit_expr ^ bit_expr
| bit_expr + interval_expr
| bit_expr - interval_expr
| simple_expr
simple_expr:
literal
| identifier
| function_call
| simple_expr COLLATE collation_name
| param_marker
| variable
| simple_expr || simple_expr
| + simple_expr
| - simple_expr
| ~ simple_expr
| ! simple_expr
| BINARY simple_expr
| (expr [, expr] ...)
| ROW (expr, expr [, expr] ...)
| (subquery)
| EXISTS (subquery)
| {identifier expr}
| match_expr
| case_expr
| interval_expr