9章语言结构

目录

9.1文字值
9.1.1 literals字符串
9.1.2数字字面值
9.1.3日期和Time Literals
9.1.4 Hexadecimal Literals
9.1.5位值的文字
literals 9.1.6布尔
9.1.7空值
9.2架构对象名称
9.2.1标识符限定符
9.2.2标识符大小写敏感
9.2.3映射标识符文件名
9.2.4函数名称解析和分辨率
关键词9.3和保留字
9.4用户定义的变量
9.5表达式的语法
9.6注释语法

这一章写以下内容的规则SQLWhen using MySQL:

9.1文字值

本节介绍如何在MySQL写的文字值。这些包括字符串、数字、进制和位值、布尔值和NULL。该部分还包括各种细微差别,你可能会遇到在处理这些基本类型在MySQL。

9.1.1 literals字符串

一个字符串是一个字符或字节序列,包含在单引号(')或双引号()字符。实例:

'a string'
"another string"

引用串放在旁边都连接到一个单一的字符串。如下是等价的:

'a string'
'a' ' ' 'string'

如果ANSI_QUOTESSQL模式启用,字符串可以被引用只在单引号因为引用双引号的字符串被解释为一个标识符。

二进制字符串是一个字符串的字节。每一个二进制字符串有一个字符集和整理命名binary。一非二进制字符串是一个字符串。它有一个字符集以外的binary和整理,与字符集兼容。

对于字符串类型,比较是基于字符串的数值的单位。对于二进制字符串,单位是字节;使用数字的字节值的比较。非二进制字符串,单位是字符和字符集支持多字节字符;使用数字字符代码值的比较。字符代码的顺序是一个字符串的排序功能。(更多信息,参见第10.8.5“二进制排序规则相比,_bin排序规则”。)

一个字符串可以有一个可选的字符集介绍人COLLATE条款,以将其指定为一个字符串,使用一个特定的字符集和整理:

[_charset_name]'string' [COLLATE collation_name]

实例:

SELECT _latin1'string';
SELECT _binary'string';
SELECT _utf8'string' COLLATE utf8_danish_ci;

你可以使用N'literal'(或nliteral')创建一个字符串中的字符集。这些陈述是等价的:

选择n'some文本;选择n'some文本;选择_utf8'some文本”;

关于这些形式的字符串的语法信息,看第10.3.7,“集”的民族性格,和第10.3.8,“字符集范围”

在一个字符串序列,一定有特殊的意义,除非NO_BACKSLASH_ESCAPESSQL模式启用。这些序列从一个反斜杠(\众所周知,英语)转义字符。MySQL中的转义序列识别表9.1,“特殊字符转义序列”。对于所有其他的转义序列,反斜杠被忽略。这是逃跑的字符被解释为如果不逃。例如,\x只是X。这些序列是敏感的。例如,\b被解释为一个退格,但\b被解释为B。逃避处理是根据字符集表示的了character_set_connection系统变量。这甚至是在介绍人表明不同字符集的字符串是真实的,如在第10.3.6”字符串的字符集和整理”

表9.1特殊字符转义序列

转义序列代表的序列特征
\0一个ASCII字符(X'00')字符
\'一个单引号(')字符
\"双引号(")字符
\b退格字符
\n在newline(linefeed)字符
\r一个回车符
\t一个制表符
\ZASCII码26(控制Z);见附注如下表
\\一个反斜杠(\)字符
\%%性格;见注如下表
\__性格;见注如下表

ASCII字符可以被编码为26\Z为了使你的工作在ASCII码26代表end-of-file Windows的问题。ASCII 26文件内的问题的原因,如果你尝试使用MySQLdb_name<file_name

这个\%“_序列是用来搜索文字实例%_在模式匹配的环境中,否则他们将被解释为通配符。看到的描述LIKE算子第12.5.1”字符串比较函数。如果你使用\%“_模式匹配的上下文之外,他们对字符串\%“_,不%_

有包括引号字符在字符串中的几种方法:

  • '在引用字符串&#39;可以写为''

  • "在引用字符串可以写为""

  • 在引号字符转义字符(\

  • '在引用字符串无需特殊处理,不需要增加一倍或逃脱。以同样的方式,"在引用字符串&#39;不需特殊治疗

以下SELECT报表演示如何引用和逃避工作:

MySQL的&#62;SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';------- --------- ----------- -------- -------- |你好|“你好”“你好”“| |来|你好| ------- --------- ----------- -------- -------- MySQL &#62;SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";| -------看书的阿| Hello Hello Hello |是是是是是是| HEL“| -------“Hello |看书的阿数据库SELECT 'This\nIs\nFour\nLines';-------------------- | thisisfourlines | -------------------- MySQL &#62;SELECT 'disappearing\ backslash';------------------------ |消失| ------------------------反斜杠

将二进制数据转换成字符串列(如BLOB列),你应该代表一定的字符转义序列。反斜杠(\)和引号用来引用字符串必须逃跑。在一定的客户环境,也要逃跑NUL或控制Z.MySQL客户端将引用字符串包含NUL人物如果不逃,控制Z可采取end-of-file Windows如果没有逃脱。表示每一个字符的转义序列,看表9.1,“特殊字符转义序列”

编写应用程序时,任何字符串可能包含任何特殊字符必须适当地逃前的字符串作为数据值在一个SQL语句发送到MySQL服务器。你可以使用这两种方式:

  • 过程与函数逃出特殊字符的字符串。在一个C程序,您可以使用mysql_real_escape_string_quote()C API函数转义字符。看到第27.7.7.56,“mysql_real_escape_string_quote()”。在SQL语句构造其他SQL语句,您可以使用QUOTE()功能。Perl接口提供了一个报价将特殊字符转义序列的正确方法。看到第27,MySQL Perl API”。其他语言的接口,可以提供类似的能力。

  • 作为一种替代明确特殊字符转义,许多MySQL API提供一个占位符的能力,可以插入特殊标记字符串的声明,然后将数据绑定值到他们当你问题的声明。在这种情况下,API需要照顾的特殊字符转义值中的你。

9.1.2数字字面值

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

整数表示为一个数字序列。数字可能包括.as a separator小数。preceded may be by numbers+表示一个或正或负的值,分别。科学记数法与尾数和指数来表征数的近似值的数字。

精确的数值常量有整数部分和小数部分,或两者。他们可能会签署。实例:123.4- 5-6.78九点一零

近似值的数字字面值是科学记数法与尾数和指数来表征。一方或双方可能会签署。实例:1.2E31.2e-3-1.2E3-1.2e-3

两个数字,类似可以区别对待。例如,2.34是一个精确值(定点)数,而2.34e0是一个近似值(浮点)数。

这个DECIMAL数据类型是定点式和计算是精确的。在MySQL的DECIMAL有几个同义词:NUMERICDECFIXED。整数类型也有确切的值类型。关于精确值计算的更多信息,参见12.23节,“精确数学”

这个FLOATDOUBLE数据类型是浮点型和计算是近似。在MySQL,这是同义词的类型FLOATDOUBLEDOUBLE PRECISIONREAL

一个整数可以用于浮点语境;它被解释为等效的浮点数。

9.1.3日期和Time Literals

日期和时间值可以在几个格式表示,如引用字符串或数字,根据价值等因素的确切类型。例如,在上下文中的MySQL的预计日期,它解释任何'2015-07-21'“20150721”,和20150721作为一个日期

本节描述可接受的格式的日期和时间常量。关于时态数据类型的更多信息,如允许值的范围,参考这些章节:

标准的SQL和ODBC的日期和时间常量。标准SQL允许时间的文字要使用类型关键字和一个字符串指定。关键词和字符串之间的空间是可选的。

DATE 'str'
TIME 'str'
TIMESTAMP 'str'

MySQL认出那些结构和相应的ODBC语法:

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

MySQL的使用类型的关键词,这些结构的产生DATETIME,和DATETIME值,分别包括尾随小数秒部分如果指定。这个TIMESTAMP语法的产生DATETIME因为在MySQL的价值DATETIME有一个范围,更紧密地对应于标准的SQLTIMESTAMP式,这一年的范围从00019999。(MySQLTIMESTAMP年的范围一千九百七十2038。)

日期和时间背景和数值常量字符串。MySQL的识别DATE这些格式中的价值:

  • 在一个字符串'YYYY-MM-DD'YY - MM - DD格式一轻松的语法是允许任何标点符号可以作为日期分隔符之间的部分。例如,'2012-12-31'“2012/12 / 31”'2012^12^31',和2012 @ 12 @ 31是等价的

  • 作为一个没有任何分隔符的字符串'YYYYMMDD'“收到录取通知时间”格式字符串,只要是有意义的日期。例如,'20070523'“070523”被解释为'2007-05-23',但“071332”是非法的(它有荒谬的月、日部分)成为'0000-00-00'

  • 在一个数YYYYMMDD收到录取通知时间格式,但数量是有意义的一个日期。例如,19830905八十三万零九百零五被解释为'1983-09-05'

MySQL的识别DATETIMETIMESTAMP这些格式中的价值:

  • 在一个字符串'YYYY-MM-DD HH:MM:SS'“YY mm dd HH MM:学生:格式一轻松的语法是允许在这里,太:任何标点符号可以用作分隔符之间的日期部分或大部分时间。例如,'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'

  • 在一个数YYYYMMDDHHMMSSyymmddhhmmss格式,但数量是有意义的一个日期。例如,19830905132800八千三百零九亿零五百一十三万二千八百被解释为'1983-09-05 13:28:00'

DATETIMETIMESTAMP值可以包括尾随小数秒参与到微秒(6位数)精度。小数部分应该由小数点从休息的时间分开;没有其他分数秒分隔符是公认的。关于分数秒支持MySQL,看第11.3.6,“小数秒的时间价值”

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

  • 在今年的范围值70-99转换为1970

  • 在今年的范围值00-69转换为2000-2069

参见第11.3.8,“约会”两位数字的年份

指定的字符串,包括日期部分分隔符的值,无需指定两个位数的月份或日期值小于10“2015-6-9”是一样的'2015-06-09'。同样,对于指定为字符串,包括部分时间分隔符的值,无需指定小时,两位数分钟,或第二数值小于'2015-10-30 1:2:3'是一样的“2015-10-30 01:02:03”

值指定为数应该是6, 8, 12,或14位数。如果一个数是8或14位数字,它被认为是在YYYYMMDDyyyymmddhhmmss格式的,今年是由前4位数字了。如果数字是6或12位数字,它被认为是在YYMMDDyymmddhhmmss格式的,今年是由前2位数字了。号码是不是一个长度的解释好像用前导零到最近的长度。

值指定为未分隔字符串被解释根据其长度。一个字符串或14个字符,今年应该是第一个四字符。否则,今年应该是前2个字符。的字符串从左到右到年,月,日,小时,分钟和秒值的解释,为许多部分是字符串中的当前。这意味着你不应该使用有少于6个字符的字符串。例如,如果您指定'9903'1999年3月,以为代表,MySQL将它转换为日期值。这是因为年和月值9903,但一天的部分是完全失踪。但是,您可以显式地指定一个值为零表示失踪一个月或一天的部分。例如,插入值'1999-03-00',使用“990300”

MySQL的识别TIME这些格式中的价值:

  • 作为一个字符串'D HH:MM:SS'格式你也可以使用下列之一轻松的语法:'HH:MM:SS'“hh:毫米'D HH:MM'“hh”,或'SS'。在这里D代表天,可以从0到34有价值。

  • 作为一个字符串中没有分隔符'HHMMSS'格式,提供的是有意义的一个时间。例如,“101112”理解为'10:11:12',但“109712”是非法的(它有一个荒谬的分钟部分)成为'00:00:00'

  • 作为一个数HHMMSS格式,提供的是有意义的一个时间。例如,十万一千一百一十二理解为'10:11:12'。下面的替代格式也明白:SSMMSS,或hhmmss

结尾部分是公认的在分数秒'D HH:MM:SS.fraction'“hh:MM:SS分数的。'HHMMSS.fraction',和hhmmss.fraction时间格式,在fraction是小数部分达微秒(6位数)精度。小数部分应该由小数点从休息的时间分开;没有其他分数秒分隔符是公认的。关于分数秒支持MySQL,看第11.3.6,“小数秒的时间价值”

TIME值指定为字符串,包括一个时间部分的分隔符,这是不必要的指定时间,两位数分钟,或小于秒的值'8:3:2'是一样的“08:03:02”

9.1.4 Hexadecimal Literals

十六进制文本值用X'val'0xval的符号,在val包含十六进制数字(0. 9A..F)。这个数字和任何领导lettercaseX不要紧。一个领导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的&#62;SET @s = X'FFF';错误1064(42000):你对你的SQL语法错误;检查对应于你的MySQL serverversion用近的x&#39;fff &#39;&#39;mysql &#62;正确的语法手册SET @s = X'0FFF';查询行,0行受影响(0秒)

值的使用0xval符号包含的数字个数为奇数被视为有一个额外的领导。例如,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条款,以将其指定为一个字符串,使用一个特定的字符集和整理:

[_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的&#62;SET @v1 = X'41';MySQL的&#62;SET @v2 = X'41'+0;MySQL的&#62;SET @v3 = CAST(X'41' AS UNSIGNED);MySQL的&#62;SELECT @v1, @v2, @v3;?????????| @ @ @ | | V1 V2 V3 |?????????|的| 65 65 | |?????????

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

MySQL的&#62;SELECT CHARSET(X''), LENGTH(X'');-------------- ------------- |字符集(X’)|长度(X’)| -------------- ------------- |二进制| 0 | -------------- ------------- MySQL &#62;SELECT X''+0;------- | X”0 | ------- | 0 | -------

这个X'val'符号是基于标准的SQL。这个0x符号是基于ODBC的进制字符串通常用来供应值BLOB专栏

将一个字符串或数字的十六进制格式的字符串,使用HEX()功能:

MySQL的&#62;SELECT HEX('cat');------------ |进制(猫的)| ------------ | 636174 | ------------ MySQL &#62;SELECT X'636174';----------- | X &#39;636174”| ----------- |猫| -----------

十六进制字符串,位运算是数字环境,但数字或二进制位操作允许在MySQL 8和更高的字符串参数。显式指定的二进制字符串上下文进制文字,使用_binary对于至少一个参数介绍:

MySQL的&#62;SET @v1 = X'000D' | X'0BC0';MySQL的&#62;SET @v2 = _binary X'000D' | X'0BC0';MySQL的&#62;SELECT HEX(@v1), HEX(@v2);————| HEX(十六进制(@ @ V1 V2)|)| ---------- ---------- | BCD | 0bcd | ---------- ----------

显示的结果出现两位操作类似,但结果没有_binary是一个bigint值,而其结果_binary是一个二进制字符串。由于在结果类型的不同,显示的值不同:高阶0位数字是不是数值结果显示。

9.1.5位值的文字

位值文字编写b'val'0bval符号val是一个二进制值写入使用0和1。任何领导LettercaseB不要紧。一个领导0b是区分大小写的,不能写成0b

法律的位值的文字:

b'01'
B'01'
0b01

非法的位值的文字:

b'2'    (2 is not a binary digit)
0B01    (0B must be written as 0b)

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

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

有点价值的文字可以有一个可选的字符集介绍人COLLATE条款,以将其指定为一个字符串,使用一个特定的字符集和整理:

[_charset_name] b'val' [COLLATE collation_name]

实例:

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

这个例子使用了b'val'符号,但0bval符号允许范围以及。有关介绍,看第10.3.8,“字符集范围”

在数字环境中,MySQL将点文字像一个整数。确保一点文字数字处理,使用它在数字环境。这样做的方法包括增加0或使用CAST(... AS UNSIGNED)。例如,一位文字分配给一个用户定义的变量被默认为一个二进制字符串。指定的值作为一个数,用它在数字环境:

MySQL的&#62;SET @v1 = b'1100001';MySQL的&#62;SET @v2 = b'1100001'+0;MySQL的&#62;SET @v3 = CAST(b'1100001' AS UNSIGNED);MySQL的&#62;SELECT @v1, @v2, @v3;------ ------ ------ | @ V1 V2 V3 | | @ @ | ------ ------ ------ |一| 97 | 97 | ------ ------ ------

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

MySQL的&#62;SELECT CHARSET(b''), LENGTH(b'');-------------- ------------- |字符集(B’)|长度(B’)| -------------- ------------- |二进制| 0 | -------------- ------------- MySQL &#62;SELECT b''+0;------- | B”0 | ------- | 0 | -------

位值记数法便于指定要分配值BIT专栏

MySQL的&#62;CREATE TABLE t (b BIT(8));MySQL的&#62;INSERT INTO t SET b = b'11111111';MySQL的&#62;INSERT INTO t SET b = b'1010';MySQL的&#62;INSERT INTO t SET b = b'0101';

在结果集的位值为二进制值,这可能显示不好。将一位值打印形式,使用它在数字环境中或使用转换等功能BIN()HEX()。高阶的0位不在转换后的值显示。

MySQL的&#62;SELECT b+0, BIN(b), OCT(b), HEX(b) FROM t;------ ---------- -------- -------- | B 0 |仓(B)| OCT(B)|进制(B)| ------ ---------- -------- -------- | 255 | 11111111 | 377 | FF | | 10 | 1010 | 12 |一| | 5 | 101 | 5 | 5 | ------ ---------- -------- --------

为点文字,位运算是数字环境,但数字或二进制位操作允许在MySQL 8和更高的字符串参数。显式指定点文字的二进制字符串上下文,使用_binary对于至少一个参数介绍:

MySQL的&#62;SET @v1 = b'000010101' | b'000101010';MySQL的&#62;SET @v2 = _binary b'000010101' | _binary b'000101010';MySQL的&#62;SELECT HEX(@v1), HEX(@v2);---------- ---------- |进制(@ V1)|进制(@ V2)| ---------- ---------- | 3f | 003f | ---------- ----------

显示的结果出现两位操作类似,但结果没有_binary是一个bigint值,而其结果_binary是一个二进制字符串。由于在结果类型的不同,显示的值不同:高阶0位数字是不是数值结果显示。

literals 9.1.6布尔

常数TRUE错误的评估1,分别。恒的名字可以写在任何lettercase。

mysql> SELECT TRUE, true, FALSE, false;
        -> 1, 1, 0, 0

9.1.7空值

这个NULL价值手段没有数据NULL可以写在任何lettercase。

要知道,NULL价值是不同的值,如对于数值类型或字符串类型的空字符串。有关更多信息,参见第b.5.4.3”问题,与空值”

文本文件导入或导出操作进行LOAD DATA INFILESELECT ... INTO OUTFILE无效的\N序列。看到第13.2.7、“LOAD DATA INFILE语法”

对于排序ORDER BY无效的在提升各种其他值的排序值,后值降序排序。

9.2架构对象名称

某些物体在mysql,包括数据库、表、索引、柱、别名、视图、存储过程、分区表空间,资源组和其他对象的名字称为标识符。本节描述标识符在MySQL允许语法。第9.2.2,“标识符大小写敏感”,描述的类型的标识符是大小写敏感的和在什么条件下。

标识符可以上市或非上市。如果一个标识符包含特殊字符或是保留字,你必须引用它,当你把它。(例外:保留字如下限定名中一段必须是一个标识符,所以它不需要被引用。)保留字列在9.3节,“关键字和保留字”

标识符转换为Unicode的内部。他们可能包含这些字符:

  • 允许的字符在不带引号的标识符:

    • ASCII码:[ 0-9,A-Z,a-z _美元](基本拉丁字母,数字0-9,美元,下划线)

    • 扩展:U 0080。u FFFF

  • 允许的字符在引号的标识符包括完整的Unicode基本多文种平面(BMP),除非你0000:

    • ASCII:U 0001。你007f

    • 扩展:U 0080。u FFFF

  • ASCII nul(U 0000)和补充字符(U 10000和更高)不允许引用或不带引号的标识符。

  • 标识符可以以数字开头但除非引用不可能只包含数字。

  • 数据库、表和列名称不能与空间特征。

标识符引用字符是反引号(`):

MySQL的&#62;SELECT * FROM `select` WHERE `select`.id > 100;

如果ANSI_QUOTESSQL模式是启用的,也可以用双引号引用的标识符:

MySQL的&#62;CREATE TABLE "test" (col INT);错误1064:你有一个错误在您的SQL语法…mysql &#62;SET sql_mode='ANSI_QUOTES';MySQL的&#62;CREATE TABLE "test" (col INT);查询行,0行受影响(0秒)

这个ANSI_QUOTES模式导致服务器解释双引号字符串的标识符。因此,当这个模式被激活,字符串必须用单引号。他们不能被包含在双引号。服务器的SQL模式控制的描述第5.1.10,”服务器的SQL模式”

标识符引用字符可以包含在一个标识符,如果你引用的标识符。如果是包含在标识符的字符,用来引用标识符本身一样,那么你需要双重性格。下面的语句创建一个表名a`b包含一个命名列C D

mysql> CREATE TABLE `a``b` (`c"d` INT);

在一个查询的选择列表,一个引用的列别名可以指定使用的标识符或字符串引用字符:

mysql> SELECT 1 AS `one`, 2 AS 'two';
+-----+-----+
| one | two |
+-----+-----+
|   1 |   2 |
+-----+-----+

在另外的场合,引用引用别名必须使用标识符引用或参考作为一个字符串。

建议您不要使用名字开头MeMEN,在那里MN是整数。例如,避免使用1E作为标识符,因为表达式如1e+3是模糊的。根据上下文,它可能被解释为表达3 1E或数1e+3

使用时要小心MD5()生产的表名是因为它可以在非法的或模棱两可的如刚才所描述的格式生成的名字。

用户变量不能直接使用SQL语句中作为标识符或标识符的一部分。看到9.4节,“用户定义的变量,更多的信息和例子的解决方法。

在数据库和表名的特殊字符都在相应的文件系统的名称进行编码第9.2.3,“映射标识符文件名”

下表描述了每种类型的标识符的最大长度。

标识符类型最大长度(字符)
数据库六十四
六十四
专栏六十四
指数六十四
约束六十四
存储程序六十四
意见六十四
表空间六十四
服务器六十四
日志文件组六十四
别名(见下表256例外)
复合语句标号十六
用户定义的变量六十四
资源组六十四

列名称的别名CREATE VIEW陈述对64个字符的最大柱长度检查(不是最大的别名长度为256个字符)。

标识符存储使用Unicode(gb3212)。这适用于表定义标识符和存储在授权表的标识符mysql数据库在授权表的标识符字符串列的尺寸测量的特点。你可以使用多字节字符的字符数不降低对存储在这些列中允许的值。如前面所指出的,允许Unicode字符是在基本多文种平面(BMP)。增补字符是不允许的。

9.2.1标识符限定符

对象名称可能不合格或合格。一个不合格的名称是在上下文中的名称的解释是明确的允许。一个合格的名称包括至少一个限定通过重写默认的上下文或语境提供明确的阐释语境缺失。

例如,该声明中使用不合格的名称创建一个表t1

创建表T1(I型);

因为t1不包括限定符指定数据库的语句创建在默认的数据库表。如果没有默认数据库,出现错误。

这一声明使用合格的名称创建一个表db1.t1

创建表db1.t1(I型);

因为db1.t1包括数据库限定DB1,该语句创建t1在指定的数据库DB1,无论默认数据库。限定符必须如果没有指定默认数据库。限定符五月如果有一个默认的数据库指定,指定与默认值不同的数据库,或如果默认为一个指定的相同使数据库的显式。

预选赛有以下特点:

  • 不合格的名称包含一个标识符。一个合格的名称由多个标识符。

  • 一个部分的名称的组件必须间隔期(.)字符。一个部分的名称作为影响范围内最终解释标识符预选赛的开始部分。

  • 限定符的字符是一个单独的标记,不需要与相关的标识符相连。例如,tbl_name.col_nametbl_name . col_name是等价的

  • 如果任何一个部件一个部件名称需要引用,引用他们单独而不是引用的名称作为一个整体。例如,写`my-table`.`my-column`,不`我的桌子。我的专栏`

  • 保留字如下限定名中一段必须是一个标识符,所以在这种情况下它不需要引用。

允许限定对象名称取决于对象类型:

  • 数据库名称是完全合格的,没有资格:

    CREATE DATABASE db1;
    
  • 表,视图,或存储程序的名称可能被赋予一个数据库名称限定符。例子不合格的合格的名字CREATE声明:

    创建表的表创建一个视图…;…;创建程序myproc…;创建函数MyFunc…;创建事件事件…;创建表创建视图mydb.myview mydb.mytable…;…;创建程序mydb.myproc…;创建功能mydb.myfunc…;创建事件mydb.myevent…;
  • 触发器与表相关联,因此任何限定适用于表名:

    CREATE TRIGGER mytrigger ... ON mytable ...;
    
    CREATE TRIGGER mytrigger ... ON mydb.mytable ...;
    
  • 列名可以给予多个修饰符表示陈述,参考其内容,如下表所示。

    列引用意义
    col_name专栏col_name从哪个表用于语句包含一列名称
    tbl_name.col_name专栏col_name从表tbl_name默认的数据库
    db_name.tbl_name.col_name专栏col_name从表tbl_name数据库的db_name

    换句话说,一个列名称可能被赋予一个表名限定符,它本身可以给定一个数据库名称限定符。例不合格和合格的列引用SELECT声明:

    SELECT c1 FROM mytableWHERE c2 > 100;SELECT mytable.c1 FROM mytableWHERE mytable.c2 > 100;SELECT mydb.mytable.c1 FROM mydb.mytableWHERE mydb.mytable.c2 > 100;

你不需要指定一个在声明一个对象引用限定除非引用模棱两可。假定柱c1只发生在表T1c2只有在T2,和c在两T1t2。任何不合格的参考C暧昧在一份声明中说,指的是既表必须合格t1.ct2.c表明这表你的意思:

SELECT c1, c2, t1.c FROM t1 INNER JOIN t2
WHERE t2.c > 100;

同样,从表中检索t在数据库DB1从表t在数据库db2在同一个语句,你必须限定表参考文献:对这些表中的列引用,预选赛仅列名称出现在表的要求。假定柱c1只发生在表db1.tc2只有在db2.t,和c在两db1.tdb2.t。在这房子,C是模糊的,但必须合格c1C2不需要:

SELECT c1, c2, db1.t.c FROM db1.t INNER JOIN db2.t
WHERE db2.t.c > 100;

表别名使资格写更简单的列引用:

SELECT c1, c2, t1.c FROM db1.t AS t1 INNER JOIN db2.t AS t2
WHERE t2.c > 100;

9.2.2标识符大小写敏感

在MySQL数据库对应目录内的数据目录。在一个数据库中对应的数据库目录中的至少一个文件的每个表(可能更多,取决于存储引擎)。触发器也对应于文件。因此,对底层操作系统的情况下对数据库、表的灵敏度是其中的一部分,和触发器的名称。这意味着这样的名称是不区分大小写的Windows,但在UNIX品种最敏感。MacOS是一个明显的例外,这是基于UNIX的可使用默认的文件系统类型(HFS),不区分大小写。然而,MacOS还支持UFS卷,这情况就像在任何UNIX敏感。看到第1.8.1,MySQL扩展标准的SQL”。这个lower_case_table_names系统变量也会影响服务器如何处理标识符大小写敏感,在本节后面介绍。

笔记

虽然数据库、表和触发器名称不区分在某些平台上的敏感,你不应该是一个在同一语句中使用不同的情况。下面的语句将不会工作,因为它是一个表作为my_tablemy_table

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

列,索引,存储程序,事件,和资源组名称不区分任何平台上的敏感,也不列别名。

然而,网络日志文件组的名称是区分大小写的。这不同于标准的SQL。

默认情况下,表的别名是区分大小写的Unix,但并不在Windows或MacOS。下面的语句将不会工作在Unix上,因为它所指的别名是a

mysql> SELECT col_name FROM tbl_name AS a
    -> WHERE a.col_name = 1 OR A.col_name = 2;

然而,这一说法是允许在Windows。为了避免由这种差异引起的问题,最好是采用一致的惯例,如创建参考数据库和表使用小写的名字。本公约的建议最大的便携性和易用性。

如何表和数据库名称存储在磁盘和使用MySQL是受lower_case_table_names系统变量lower_case_table_names可以在下表中显示的值。这个变量的作用影响触发标识区分。在Unix操作系统下,默认值lower_case_table_names0。在Windows中,默认值是1。在MacOS,缺省值是2.。

lower_case_table_names只能配置初始化服务器时。改变lower_case_table_names在服务器初始化设置是禁止的。

价值意义
0表和数据库的名称存储在使用指定的lettercase盘CREATE TABLECREATE DATABASE声明。名字比较是区分大小写的。你应该如果你是一个系统,不区分大小写的文件名运行MySQL这个变量设置为0(如Windows或MacOS)。如果你强迫这个变量为0--lower-case-table-names=0在不区分大小写的文件系统的访问MyISAM使用不同的lettercases tablenames,可能导致腐败指数。
1表格名称存储在磁盘上,名称比较小写字母不区分大小写。MySQL将所有的表名为小写字母的存储和查找。这种行为也适用于数据库名称和表的别名。
2表和数据库的名称存储在使用指定的lettercase盘CREATE TABLECREATE DATABASE声明,但是MySQL转换成小写查找。名称比较不区分大小写。这部作品只有那是不区分大小写的文件系统!InnoDB表名和表视图名称存储在小写,如lower_case_table_names=1

如果你使用的是MySQL只在一个平台上,你通常不需要使用lower_case_table_names除了默认设置。然而,你可能想要转移表之间的平台,不同的文件系统的情况下灵敏度遇到困难。例如,在UNIX系统下,你可以有两个不同的表my_tableMY_TABLE,但在Windows这两个名字是相同的。为了避免数据传输从数据库或表的名称lettercase所产生的问题,你有两个选择:

  • 使用lower_case_table_names=1在所有系统。这的主要缺点是,当你使用SHOW TABLESSHOW DATABASES,你不在原来的lettercase看到的名字。

  • 使用lower_case_table_names=0在UNIX和lower_case_table_names=2在Windows。这保留了数据库和表名的lettercase。这样的缺点是,你必须确保你的陈述总是提到你的数据库和表的名称在Windows上正确的lettercase。如果你将你的陈述lettercase UNIX,哪里是重要的,他们不在lettercase是错误的工作。

    例外如果您使用的是:InnoDB表和你试图避免这些数据传输的问题,你应该使用lower_case_table_names=1给力的名字被转换为小写字母的所有平台。

对象名称可考虑重复如果按二进制排序规则的大写形式是平等的。这名字的游标,条件,程序,功能,保存点是真的,存储的常规参数,存储程序的局部变量和插件。名称列、约束、数据库分区是不真实的,报表编写PREPARE、表、触发器、用户,和用户定义的变量。

文件系统大小可以影响搜索字符串的列INFORMATION_SCHEMA表有关更多信息,参见第10.8.7,“使用排序规则在information_schema搜索”

9.2.3映射标识符文件名

有对应关系的数据库和表文件系统中的标识和名称。的基本结构,MySQL数据库作为数据表示一个目录一个目录,并根据每个表的存储引擎,可以通过在适当的数据库目录中的一个或多个文件的代表。

对数据和索引文件,磁盘上的精确表示存储引擎的具体。这些文件可以存储在数据库目录,或信息可存储在一个单独的文件。InnoDB数据存储在InnoDB数据文件。如果你正在使用的表空间与InnoDB,然后具体的表空间文件创建代替。

任何字符是合法的数据库或表的标识符除了ASCII nul(X'00')。MySQL的任何字符编码所对应的文件系统对象的问题时,它创建数据库表文件或目录:

  • 基本拉丁字母(a..zA..Z(一)位0. 9)和下划线(_)编码是。因此,他们的大小直接取决于文件系统的特点。

  • 所有其他国家字母字母有大写/小写映射编码如下表所示。在代码范围列值UCS-2值。

    编码范围模式用过的未使用的街区
    00c0 ..017f[“] [ 0,4 ..z ] [克]5*20= 100九十七Latin-1补充拉丁扩展A
    ..03ff 0370[“],[ 5 ],[九克..z ]5*20= 100八十八十二希腊文及科普特文
    美国..052f[“] [克] ..6 ..z [ 0 ]20*7= 140一百三十七cyrillic cyrillic增刊
    0530 ..058f[“] ..z [克] [ 7 ] 8。20*2= 40三十八亚美尼亚
    ..217f 2160[“] [克] [ 9 ] ..z20*1= 20十六数的形式
    我..02af[“] [克] ..k ..z [ A ]20*11=220二百零三十七拉丁美洲的扩展(扩展)
    1 00[“] [克] ..r ..z [ L ]20*7= 140一百三十六附加扩展拉丁语
    1fff 1f00 ..[“] [克] [美国。Z。Z ]20*8= 160一百四十四十六希腊扩展
    的…的…[“] [ A ] ..z ..f [克]6*20= 120一百二十保留
    24b6 ..24e9[“] [ ] [ ] A Z @二十六二十六封闭式字母数字
    ff21 ..ff5a[“] [ ] [ ] A Z @二十六二十六半角和全角形式

    一个序列中的字节编码lettercase。例如:LATIN CAPITAL LETTER A WITH GRAVE编码为“0g反之,LATIN SMALL LETTER A WITH GRAVE编码为“0g。这里的第三个字节(GGlettercase)表示。(在不区分大小写的文件系统,字母将被视为相同。)

    一些街区,如西里尔,第二字节决定lettercase。其他的块,如latin1补充,第三字节的决定lettercase。如果序列中的两个字节的字母(如希腊延长),最左边的字母代表lettercase。其他所有字节必须小写字母。

  • 所有非字母字符(除了强调_),以及字母的字母没有大写/小写映射(比如希伯来语)使用的是十六进制表示使用十六进制数字小写字母编码F A

    0x003F -> @003f
    0xFFFF -> @ffff
    

    十六进制值对应的特征值ucs2双字节字符集

在Windows中,一些名字如nulPRN,和aux进行编码,通过添加@ @ @的名字时,服务器创建相应的文件或目录。这发生在所有平台上的相应的数据库对象的平台之间的可移植性。

9.2.4函数名称解析和分辨率

MySQL支持内置(母语)的功能,用户自定义函数(UDF),和存储功能。本节介绍服务器如何识别是否内置函数的名称作为函数调用或者作为标识符,和服务器如何决定使用哪个函数时,函数在不同类型具有给定名称的存在。

内置函数的名称解析

解析器使用默认规则解析内置函数名。这些规则可以使IGNORE_SPACESQL模式

当解析器遇到一个词,是一个内置的函数的名称,它必须决定这个名字意味着一个函数调用或是相反,阴性参考标识符如表或列的名称。例如,在下面的陈述,第一参考count是一个函数调用,而第二参考表名:

select count(*)从mytable;创建表的计数(I型);

解析器应该认识到一个内置的函数名为指示函数调用时解析什么是有望成为一种表达。即,在阴性语境,函数名可以作为标识符。

然而,一些内置的功能有特殊的解析和执行方面的考虑,所以解析器使用下列规则默认区分他们的名字被用作函数调用或为阴性的上下文标识符:

  • 用这个名字作为表达式中调用一个函数,必须有名称和下面之间没有空格(括号字符

  • 相反,使用函数名作为标识符,它不能紧跟括号。

要求函数调用被写有空格之间的名称和括号仅适用于有特殊考虑的内置函数。COUNT就是这样的一个名字。这个SQL / lex.h源文件列表下面的空格,确定他们的解释这些特殊函数的名字:定义的名称SYM_FN()宏在符号阵列

在MySQL 8中,大约有30个这样的函数名。你会发现很容易把空格的要求适用于所有的函数调用。

下面的列表的名称是受功能IGNORE_SPACE设置列为特殊的SQL / lex.h源文件

  • BIT_AND

  • BIT_OR

  • BIT_XOR

  • CAST

  • COUNT

  • CURDATE

  • CURTIME

  • DATE_ADD

  • DATE_SUB

  • EXTRACT

  • GROUP_CONCAT

  • MAX

  • MID

  • MIN

  • NOW

  • POSITION

  • STD

  • STDDEV

  • STDDEV_POP

  • STDDEV_SAMP

  • SUBSTR

  • SUBSTRING

  • SUM

  • SYSDATE

  • TRIM

  • VARIANCE

  • VAR_POP

  • VAR_SAMP

不列为特殊功能sql/lex.h不要紧,空白。他们被解释为函数调用时用于表达语境,可以自由使用,否则作为标识符。ASCII码就是这样的一个名字。然而,这些未受影响的函数名称,解释可能在表达语境不同:func_name ()被解释为一个内置的函数,如果存在一个给定的名称;如果不是,func_name()被解释为一个用户定义的函数或存储功能,如果存在该名称。

这个IGNORE_SPACESQL模式可以用来修改解析器如何对待那些空白敏感函数名:

  • IGNORE_SPACE残疾人,解析器解释名称作为函数调用的时候是有名字的,下面的括号之间没有空格。发生这种情况,即使函数名称用于阴性语境:

    MySQL的&#62;CREATE TABLE count(i INT);错误1064(42000):你有一个错误在您的SQL语法…近数(I型)”

    为了消除错误造成的名称被视为一个标识符,可以使用空格之后的名称或把它作为引用的标识符(或两者):

    CREATE TABLE count (i INT);
    CREATE TABLE `count`(i INT);
    CREATE TABLE `count` (i INT);
    
  • IGNORE_SPACE启用,解析器放松有函数名和括号之间没有空格的要求如下。这提供了更多的灵活性,在写作中的函数调用。例如,下列函数调用是合法的:

    select count(*)从mytable;select count(*)从mytable;

    然而,使IGNORE_SPACE同时,受影响的函数名字解析器把保留字的副作用(见9.3节,“关键字和保留字”)。这意味着空间在名字不再意味着其作为一个标识符。这个名字可以用在函数调用或没有下面的空格,但会导致语法错误在阴性语境除非是引用。例如,用IGNORE_SPACE启用,下面两个语句没有语法错误因为解析器解释计数作为一个保留字:

    CREATE TABLE count(i INT);
    CREATE TABLE count (i INT);
    

    在阴性的情况下使用的函数名称,把它作为一个引用标识符:

    CREATE TABLE `count`(i INT);
    CREATE TABLE `count` (i INT);
    

为了使IGNORE_SPACESQL模式,使用这条语句:

SET sql_mode = 'IGNORE_SPACE';

IGNORE_SPACE也为某些其他复合模式等功能ANSI这包括在他们的价值:

SET sql_mode = 'ANSI';

检查第5.1.10,”服务器的SQL模式”,看到复合模式使IGNORE_SPACE

为了减少对SQL代码的依赖IGNORE_SPACE设置、使用这些指南:

  • 避免创建udf或存储功能,内置函数相同的名字。

  • 避免阴性语境运用函数名。例如,这些语句的使用count(一个受影响的函数名称的影响IGNORE_SPACE),所以他们不带或不带空格之后的名称如果IGNORE_SPACE启用:

    创建表的计数(I型);创建表的计数(I型);

    如果你必须在阴性语境中使用函数名,把它作为一个引用标识符:

    CREATE TABLE `count`(i INT);
    CREATE TABLE `count` (i INT);
    

域名解析功能

以下描述服务器如何解析函数的函数创建和调用的名称引用规则:

  • 内置函数和用户定义函数

    如果你想创建一个UDF具有相同的名称作为一个内置的函数发生错误。

  • 内置函数和存储功能

    它可以创建一个存储函数具有相同的名称作为一个内置的功能,但调用存储的功能必须与架构名称限定它。例如,如果你创建一个存储功能命名PI测试图式的Invoke,它test.PI()因为服务器解析PI()没有限定为参考,内置函数。如果存储函数的名称与内置函数名称时服务器会生成一个警告。警告可以显示SHOW WARNINGS

  • 用户定义的函数和存储功能

    用户定义的函数和存储功能共享相同的命名空间,所以你不能创建一个UDF和存储函数具有相同的名称。

前面的函数名称解析规则已经升级到版本的MySQL实现新的内置功能的影响:

  • 如果你已经创建了一个用户定义的函数与一个给定的名称和升级MySQL版本,实现了一种新的内置函数具有相同的名称,UDF变得不可访问。要纠正此问题,使用DROP FUNCTION下降的UDF和CREATE FUNCTION再以不同的名字创建udf不冲突。然后修改任何受影响的代码使用新名称。

  • 如果一个新版本的MySQL实现内置函数相同的名称与现有的存储功能,你有两种选择:重命名存储功能使用不冲突的名称,或更改电话让他们使用模式限定的函数(即使用schema_name.func_name()语法)。在任何情况下,相应地修改任何受影响的代码。

关键词9.3和保留字

关键词:SQL中有意义的话。某些关键词,如SELECTDELETE,或BIGINT,是保留和需要作为标识符使用如表名和列名的特殊处理。这也可能为内置函数的名字是真的。

非保留关键字作为标识符不允许引用。保留字是允许作为标识符,如果你引用他们所描述的9.2节,“架构对象名称”

mysql> CREATE TABLE interval (begin INT, end INT);
ERROR 1064 (42000): You have an error in your SQL syntax ...
near 'interval (begin INT, end INT)'

BEGIN结束关键词但不保留,所以其使用的标识符不需要引用。INTERVAL是一个保留关键字,必须引用作为标识符:

MySQL的&#62;CREATE TABLE `interval` (begin INT, end INT);查询好,为受影响的行(0.01秒)

例外:如下限定名中一段必须是一个标识符的一个词,所以它不需要引用,即使是保留:

mysql> CREATE TABLE mydb.interval (begin INT, end INT);
Query OK, 0 rows affected (0.01 sec)

内置函数的名字是允许作为标识符但可能需要照顾,作为这样的。例如,COUNT可作为栏目名称。然而,默认情况下,空格是函数调用的函数名称和下面之间允许人物这个要求使解析器来区分是否使用该名称在函数调用的上下文或无功能。在函数名称识别的进一步的细节,见9.2.4节,“函数名称解析和解决”

这个INFORMATION_SCHEMA.KEYWORDS表中列出的话考虑关键词的MySQL和指示是否保留。看到24.11节,“information_schema关键词表”

MySQL 8的关键字和保留字

以下列表显示关键字和保留字在MySQL 5.0,随着个别单词的变化版本。保留关键字标记(R)。此外,_FILENAME保留

在某些时候,你可能会升级到更高版本,所以它在未来的保留字,一看是一个好主意,太。你可以在手册覆盖高版本的MySQL找到这些。列表中的大多数的保留字是用标准的SQL列或表的名称(例如禁止,GROUP)。少数是因为MySQL需要保留和使用Yacc分析器

|B|C|D|E|F|G|H|I|J|K|l|M|N|o|P|Q|R|S|T|U|v|W|X|Y|Z

  • ACCESSIBLE(R)

  • ACCOUNT

  • ACTION

  • ACTIVE加入8.0.14(非预定)

  • ADD(R)

  • ADMIN成为非预定在8.0.12

  • AFTER

  • AGAINST

  • AGGREGATE

  • ALGORITHM

  • ALL(R)

  • ALTER(R)

  • ALWAYS

  • ANALYSE除去8.0.1

  • ANALYZE(R)

  • AND(R)

  • ANY

  • AS(R)

  • ASC(R)

  • ASCII

  • ASENSITIVE(R)

  • AT

  • AUTOEXTEND_SIZE

  • AUTO_INCREMENT

  • AVG

  • AVG_ROW_LENGTH

B

  • BACKUP

  • BEFORE(R)

  • BEGIN

  • BETWEEN(R)

  • BIGINT(R)

  • BINARY(R)

  • BINLOG

  • BIT

  • BLOB(R)

  • BLOCK

  • BOOL

  • BOOLEAN

  • BOTH(R)

  • BTREE

  • BUCKETS加入8.0.2(非预定)

  • BY(R)

  • BYTE

C

  • CACHE

  • CALL(R)

  • CASCADE(R)

  • CASCADED

  • CASE(R)

  • CATALOG_NAME

  • CHAIN

  • CHANGE(R)

  • CHANGED

  • CHANNEL

  • CHAR(R)

  • CHARACTER(R)

  • CHARSET

  • CHECK(R)

  • CHECKSUM

  • CIPHER

  • CLASS_ORIGIN

  • CLIENT

  • CLONE加入8.0.3(非预定)

  • CLOSE

  • COALESCE

  • CODE

  • COLLATE(R)

  • COLLATION

  • COLUMN(R)

  • COLUMNS

  • COLUMN_FORMAT

  • COLUMN_NAME

  • COMMENT

  • COMMIT

  • COMMITTED

  • COMPACT

  • COMPLETION

  • COMPONENT

  • COMPRESSED

  • COMPRESSION

  • CONCURRENT

  • CONDITION(R)

  • CONNECTION

  • CONSISTENT

  • CONSTRAINT(R)

  • CONSTRAINT_CATALOG

  • CONSTRAINT_NAME

  • CONSTRAINT_SCHEMA

  • CONTAINS

  • CONTEXT

  • CONTINUE(R)

  • CONVERT(R)

  • CPU

  • CREATE(R)

  • CROSS(R)

  • CUBE(R)被保留在8.0.1

  • CUME_DIST(R)加入8.0.2(预留)

  • CURRENT

  • CURRENT_DATE(R)

  • CURRENT_TIME(R)

  • CURRENT_TIMESTAMP(R)

  • CURRENT_USER(R)

  • CURSOR(R)

  • CURSOR_NAME

D

  • DATA

  • DATABASE(R)

  • DATABASES(R)

  • DATAFILE

  • DATE

  • DATETIME

  • DAY

  • DAY_HOUR(R)

  • DAY_MICROSECOND(R)

  • DAY_MINUTE(R)

  • DAY_SECOND(R)

  • DEALLOCATE

  • DEC(R)

  • DECIMAL(R)

  • DECLARE(R)

  • DEFAULT(R)

  • DEFAULT_AUTH

  • DEFINER

  • DEFINITION加入8.0.11(非预定)

  • DELAYED(R)

  • DELAY_KEY_WRITE

  • DELETE(R)

  • DENSE_RANK(R)加入8.0.2(预留)

  • DESC(R)

  • DESCRIBE(R)

  • DESCRIPTION加入8.0.11(非预定)

  • DES_KEY_FILE除去8.0.3

  • DETERMINISTIC(R)

  • DIAGNOSTICS

  • DIRECTORY

  • DISABLE

  • DISCARD

  • DISK

  • DISTINCT(R)

  • DISTINCTROW(R)

  • DIV(R)

  • DO

  • DOUBLE(R)

  • DROP(R)

  • DUAL(R)

  • DUMPFILE

  • DUPLICATE

  • DYNAMIC

E

  • EACH(R)

  • ELSE(R)

  • ELSEIF(R)

  • EMPTY(R)加入8.0.4(预留)

  • ENABLE

  • ENCLOSED(R)

  • ENCRYPTION

  • END

  • ENDS

  • ENGINE

  • ENGINES

  • ENUM

  • ERROR

  • ERRORS

  • ESCAPE

  • ESCAPED(R)

  • EVENT

  • EVENTS

  • EVERY

  • EXCEPT(R)

  • EXCHANGE

  • EXCLUDE加入8.0.2(非预定)

  • EXECUTE

  • EXISTS(R)

  • EXIT(R)

  • EXPANSION

  • EXPIRE

  • EXPLAIN(R)

  • EXPORT

  • EXTENDED

  • EXTENT_SIZE

F

  • FALSE(R)

  • FAST

  • FAULTS

  • FETCH(R)

  • FIELDS

  • FILE

  • FILE_BLOCK_SIZE

  • FILTER

  • FIRST

  • FIRST_VALUE(R)加入8.0.2(预留)

  • FIXED

  • FLOAT(R)

  • FLOAT4(R)

  • FLOAT8(R)

  • FLUSH

  • FOLLOWING加入8.0.2(非预定)

  • FOLLOWS

  • FOR(R)

  • FORCE(R)

  • FOREIGN(R)

  • FORMAT

  • FOUND

  • FROM(R)

  • FULL

  • FULLTEXT(R)

  • FUNCTION(R)被保留在8.0.1

G

  • GENERAL

  • GENERATED(R)

  • GEOMCOLLECTION加入8.0.11(非预定)

  • GEOMETRY

  • GEOMETRYCOLLECTION

  • GET(R)

  • GET_FORMAT

  • GET_MASTER_PUBLIC_KEY加入8.0.11(非预定)

  • GLOBAL

  • GRANT(R)

  • GRANTS

  • GROUP(R)

  • GROUPING(R)加入8.0.1(预留)

  • GROUPS(R)加入8.0.2(预留)

  • GROUP_REPLICATION

H

  • HANDLER

  • HASH

  • HAVING(R)

  • HELP

  • HIGH_PRIORITY(R)

  • HISTOGRAM加入8.0.2(非预定)

  • HISTORY加入8.0.3(非预定)

  • HOST

  • HOSTS

  • HOUR

  • HOUR_MICROSECOND(R)

  • HOUR_MINUTE(R)

  • HOUR_SECOND(R)

I

  • IDENTIFIED

  • IF(R)

  • IGNORE(R)

  • IGNORE_SERVER_IDS

  • IMPORT

  • IN(R)

  • INACTIVE加入8.0.14(非预定)

  • INDEX(R)

  • INDEXES

  • INFILE(R)

  • INITIAL_SIZE

  • INNER(R)

  • INOUT(R)

  • INSENSITIVE(R)

  • INSERT(R)

  • INSERT_METHOD

  • INSTALL

  • INSTANCE

  • INT(R)

  • INT1(R)

  • INT2(R)

  • INT3(R)

  • INT4(R)

  • INT8(R)

  • INTEGER(R)

  • INTERVAL(R)

  • INTO(R)

  • INVISIBLE

  • INVOKER

  • IO

  • IO_AFTER_GTIDS(R)

  • IO_BEFORE_GTIDS(R)

  • IO_THREAD

  • IPC

  • IS(R)

  • ISOLATION

  • ISSUER

  • ITERATE(R)

J

  • JOIN(R)

  • JSON

  • JSON_TABLE(R)加入8.0.4(预留)

K

  • KEY(R)

  • KEYS(R)

  • KEY_BLOCK_SIZE

  • KILL(R)

l

  • LAG(R)加入8.0.2(预留)

  • LANGUAGE

  • LAST

  • LAST_VALUE(R)加入8.0.2(预留)

  • LEAD(R)加入8.0.2(预留)

  • LEADING(R)

  • LEAVE(R)

  • LEAVES

  • LEFT(R)

  • LESS

  • LEVEL

  • LIKE(R)

  • LIMIT(R)

  • LINEAR(R)

  • LINES(R)

  • LINESTRING

  • LIST

  • LOAD(R)

  • LOCAL

  • LOCALTIME(R)

  • LOCALTIMESTAMP(R)

  • LOCK(R)

  • LOCKED加入8.0.1(非预定)

  • LOCKS

  • LOGFILE

  • LOGS

  • LONG(R)

  • LONGBLOB(R)

  • LONGTEXT(R)

  • LOOP(R)

  • LOW_PRIORITY(R)

M

  • MASTER

  • MASTER_AUTO_POSITION

  • MASTER_BIND(R)

  • MASTER_CONNECT_RETRY

  • MASTER_DELAY

  • MASTER_HEARTBEAT_PERIOD

  • MASTER_HOST

  • MASTER_LOG_FILE

  • MASTER_LOG_POS

  • MASTER_PASSWORD

  • MASTER_PORT

  • MASTER_PUBLIC_KEY_PATH加入8.0.11(非预定)

  • MASTER_RETRY_COUNT

  • MASTER_SERVER_ID

  • MASTER_SSL

  • MASTER_SSL_CA

  • MASTER_SSL_CAPATH

  • MASTER_SSL_CERT

  • MASTER_SSL_CIPHER

  • MASTER_SSL_CRL

  • MASTER_SSL_CRLPATH

  • MASTER_SSL_KEY

  • MASTER_SSL_VERIFY_SERVER_CERT(R)

  • MASTER_TLS_VERSION

  • MASTER_USER

  • MATCH(R)

  • MAXVALUE(R)

  • MAX_CONNECTIONS_PER_HOUR

  • MAX_QUERIES_PER_HOUR

  • MAX_ROWS

  • MAX_SIZE

  • MAX_UPDATES_PER_HOUR

  • MAX_USER_CONNECTIONS

  • MEDIUM

  • MEDIUMBLOB(R)

  • MEDIUMINT(R)

  • MEDIUMTEXT(R)

  • MEMORY

  • MERGE

  • MESSAGE_TEXT

  • MICROSECOND

  • MIDDLEINT(R)

  • MIGRATE

  • MINUTE

  • MINUTE_MICROSECOND(R)

  • MINUTE_SECOND(R)

  • MIN_ROWS

  • MOD(R)

  • MODE

  • MODIFIES(R)

  • MODIFY

  • MONTH

  • MULTILINESTRING

  • MULTIPOINT

  • MULTIPOLYGON

  • MUTEX

  • MYSQL_ERRNO

N

  • NAME

  • NAMES

  • NATIONAL

  • NATURAL(R)

  • NCHAR

  • NDB

  • NDBCLUSTER

  • NESTED加入8.0.4(非预定)

  • NEVER

  • NEW

  • NEXT

  • NO

  • NODEGROUP

  • NONE

  • NOT(R)

  • NOWAIT加入8.0.1(非预定)

  • NO_WAIT

  • NO_WRITE_TO_BINLOG(R)

  • NTH_VALUE(R)加入8.0.2(预留)

  • NTILE(R)加入8.0.2(预留)

  • NULL(R)

  • NULLS加入8.0.2(非预定)

  • NUMBER

  • NUMERIC(R)

  • NVARCHAR

o

  • OF(R)加入8.0.1(预留)

  • OFFSET

  • ON(R)

  • ONE

  • ONLY

  • OPEN

  • OPTIMIZE(R)

  • OPTIMIZER_COSTS(R)

  • OPTION(R)

  • OPTIONAL加入8.0.13(非预定)

  • OPTIONALLY(R)

  • OPTIONS

  • OR(R)

  • ORDER(R)

  • ORDINALITY加入8.0.4(非预定)

  • ORGANIZATION加入8.0.11(非预定)

  • OTHERS加入8.0.2(非预定)

  • OUT(R)

  • OUTER(R)

  • OUTFILE(R)

  • OVER(R)加入8.0.2(预留)

  • OWNER

P

  • PACK_KEYS

  • PAGE

  • PARSER

  • PARTIAL

  • PARTITION(R)

  • PARTITIONING

  • PARTITIONS

  • PASSWORD

  • PATH加入8.0.4(非预定)

  • PERCENT_RANK(R)加入8.0.2(预留)

  • PERSIST(R)

  • PERSIST_ONLY(R)加入8.0.2(预留)

  • PHASE

  • PLUGIN

  • PLUGINS

  • PLUGIN_DIR

  • POINT

  • POLYGON

  • PORT

  • PRECEDES

  • PRECEDING加入8.0.2(非预定)

  • PRECISION(R)

  • PREPARE

  • PRESERVE

  • PREV

  • PRIMARY(R)

  • PRIVILEGES

  • PROCEDURE(R)

  • PROCESS加入8.0.11(非预定)

  • PROCESSLIST

  • PROFILE

  • PROFILES

  • PROXY

  • PURGE(R)

Q

  • QUARTER

  • QUERY

  • QUICK

R

  • RANGE(R)

  • RANK(R)加入8.0.2(预留)

  • READ(R)

  • READS(R)

  • READ_ONLY

  • READ_WRITE(R)

  • REAL(R)

  • REBUILD

  • RECOVER

  • RECURSIVE(R)加入8.0.1(预留)

  • REDOFILE除去8.0.3

  • REDO_BUFFER_SIZE

  • REDUNDANT

  • REFERENCE加入8.0.11(非预定)

  • REFERENCES(R)

  • REGEXP(R)

  • RELAY

  • RELAYLOG

  • RELAY_LOG_FILE

  • RELAY_LOG_POS

  • RELAY_THREAD

  • RELEASE(R)

  • RELOAD

  • REMOTE加入8.0.3(非预定);删除8.0.14

  • REMOVE

  • RENAME(R)

  • REORGANIZE

  • REPAIR

  • REPEAT(R)

  • REPEATABLE

  • REPLACE(R)

  • REPLICATE_DO_DB

  • REPLICATE_DO_TABLE

  • REPLICATE_IGNORE_DB

  • REPLICATE_IGNORE_TABLE

  • REPLICATE_REWRITE_DB

  • REPLICATE_WILD_DO_TABLE

  • REPLICATE_WILD_IGNORE_TABLE

  • REPLICATION

  • REQUIRE(R)

  • RESET

  • RESIGNAL(R)

  • RESOURCE加入8.0.3(非预定)

  • RESPECT加入8.0.2(非预定)

  • RESTART加入8.0.11(非预定)

  • RESTORE

  • RESTRICT(R)

  • RESUME

  • RETURN(R)

  • RETURNED_SQLSTATE

  • RETURNS

  • REUSE加入8.0.3(非预定)

  • REVERSE

  • REVOKE(R)

  • RIGHT(R)

  • RLIKE(R)

  • ROLE成为非预定在8.0.1

  • ROLLBACK

  • ROLLUP

  • ROTATE

  • ROUTINE

  • ROW(R)被保留在8.0.2

  • ROWS(R)被保留在8.0.2

  • ROW_COUNT

  • ROW_FORMAT

  • ROW_NUMBER(R)加入8.0.2(预留)

  • RTREE

S

  • SAVEPOINT

  • SCHEDULE

  • SCHEMA(R)

  • SCHEMAS(R)

  • SCHEMA_NAME

  • SECOND

  • SECONDARY_ENGINE加入8.0.13(非预定)

  • SECONDARY_LOAD加入8.0.13(非预定)

  • SECONDARY_UNLOAD加入8.0.13(非预定)

  • SECOND_MICROSECOND(R)

  • SECURITY

  • SELECT(R)

  • SENSITIVE(R)

  • SEPARATOR(R)

  • SERIAL

  • SERIALIZABLE

  • SERVER

  • SESSION

  • SET(R)

  • SHARE

  • SHOW(R)

  • SHUTDOWN

  • SIGNAL(R)

  • SIGNED

  • SIMPLE

  • SKIP加入8.0.1(非预定)

  • SLAVE

  • SLOW

  • SMALLINT(R)

  • SNAPSHOT

  • SOCKET

  • SOME

  • SONAME

  • SOUNDS

  • SOURCE

  • SPATIAL(R)

  • SPECIFIC(R)

  • SQL(R)

  • SQLEXCEPTION(R)

  • SQLSTATE(R)

  • SQLWARNING(R)

  • SQL_AFTER_GTIDS

  • SQL_AFTER_MTS_GAPS

  • SQL_BEFORE_GTIDS

  • SQL_BIG_RESULT(R)

  • SQL_BUFFER_RESULT

  • SQL_CACHE除去8.0.3

  • SQL_CALC_FOUND_ROWS(R)

  • SQL_NO_CACHE

  • SQL_SMALL_RESULT(R)

  • SQL_THREAD

  • SQL_TSI_DAY

  • SQL_TSI_HOUR

  • SQL_TSI_MINUTE

  • SQL_TSI_MONTH

  • SQL_TSI_QUARTER

  • SQL_TSI_SECOND

  • SQL_TSI_WEEK

  • SQL_TSI_YEAR

  • SRID加入8.0.3(非预定)

  • SSL(R)

  • STACKED

  • START

  • STARTING(R)

  • STARTS

  • STATS_AUTO_RECALC

  • STATS_PERSISTENT

  • STATS_SAMPLE_PAGES

  • STATUS

  • STOP

  • STORAGE

  • STORED(R)

  • STRAIGHT_JOIN(R)

  • STRING

  • SUBCLASS_ORIGIN

  • SUBJECT

  • SUBPARTITION

  • SUBPARTITIONS

  • SUPER

  • SUSPEND

  • SWAPS

  • SWITCHES

  • SYSTEM(R)加入8.0.3(预留)

T

  • TABLE(R)

  • TABLES

  • TABLESPACE

  • TABLE_CHECKSUM

  • TABLE_NAME

  • TEMPORARY

  • TEMPTABLE

  • TERMINATED(R)

  • TEXT

  • THAN

  • THEN(R)

  • THREAD_PRIORITY加入8.0.3(非预定)

  • TIES加入8.0.2(非预定)

  • TIME

  • TIMESTAMP

  • TIMESTAMPADD

  • TIMESTAMPDIFF

  • TINYBLOB(R)

  • TINYINT(R)

  • TINYTEXT(R)

  • TO(R)

  • TRAILING(R)

  • TRANSACTION

  • TRIGGER(R)

  • TRIGGERS

  • TRUE(R)

  • TRUNCATE

  • TYPE

  • TYPES

U

  • UNBOUNDED加入8.0.2(非预定)

  • UNCOMMITTED

  • UNDEFINED

  • UNDO(R)

  • UNDOFILE

  • UNDO_BUFFER_SIZE

  • UNICODE

  • UNINSTALL

  • UNION(R)

  • UNIQUE(R)

  • UNKNOWN

  • UNLOCK(R)

  • UNSIGNED(R)

  • UNTIL

  • UPDATE(R)

  • UPGRADE

  • USAGE(R)

  • USE(R)

  • USER

  • USER_RESOURCES

  • USE_FRM

  • USING(R)

  • UTC_DATE(R)

  • UTC_TIME(R)

  • UTC_TIMESTAMP(R)

v

  • VALIDATION

  • VALUE

  • VALUES(R)

  • VARBINARY(R)

  • VARCHAR(R)

  • VARCHARACTER(R)

  • VARIABLES

  • VARYING(R)

  • VCPU加入8.0.3(非预定)

  • VIEW

  • VIRTUAL(R)

  • VISIBLE

W

  • WAIT

  • WARNINGS

  • WEEK

  • WEIGHT_STRING

  • WHEN(R)

  • WHERE(R)

  • WHILE(R)

  • WINDOW(R)加入8.0.2(预留)

  • WITH(R)

  • WITHOUT

  • WORK

  • WRAPPER

  • WRITE(R)

X

  • X509

  • XA

  • XID

  • XML

  • XOR(R)

Y

  • YEAR

  • YEAR_MONTH(R)

Z

  • ZEROFILL(R)

MySQL 8新的关键字和保留字

以下列表显示关键字和保留字,在MySQL 5.0补充说,相比于MySQL 5.7。保留关键字标记(R)。

|B|C|D|E|F|G|H|I|J|l|M|N|o|P|R|S|T|U|v|W

  • ACTIVE

  • ADMIN

B

  • BUCKETS

C

  • CLONE

  • COMPONENT

  • CUME_DIST(R)

D

  • DEFINITION

  • DENSE_RANK(R)

  • DESCRIPTION

E

  • EMPTY(R)

  • EXCEPT(R)

  • EXCLUDE

F

  • FIRST_VALUE(R)

  • FOLLOWING

G

  • GEOMCOLLECTION

  • GET_MASTER_PUBLIC_KEY

  • GROUPING(R)

  • GROUPS(R)

H

  • HISTOGRAM

  • HISTORY

I

  • INACTIVE

  • INVISIBLE

J

  • JSON_TABLE(R)

l

  • LAG(R)

  • LAST_VALUE(R)

  • LEAD(R)

  • LOCKED

M

  • MASTER_PUBLIC_KEY_PATH

N

  • NESTED

  • NOWAIT

  • NTH_VALUE(R)

  • NTILE(R)

  • NULLS

o

  • OF(R)

  • OPTIONAL

  • ORDINALITY

  • ORGANIZATION

  • OTHERS

  • OVER(R)

P

  • PATH

  • PERCENT_RANK(R)

  • PERSIST(R)

  • PERSIST_ONLY(R)

  • PRECEDING

  • PROCESS

R

  • RANK(R)

  • RECURSIVE(R)

  • REFERENCE

  • RESOURCE

  • RESPECT

  • RESTART

  • REUSE

  • ROLE

  • ROW_NUMBER(R)

S

  • SECONDARY_ENGINE

  • SECONDARY_LOAD

  • SECONDARY_UNLOAD

  • SKIP

  • SRID

  • SYSTEM(R)

T

  • THREAD_PRIORITY

  • TIES

U

  • UNBOUNDED

v

  • VCPU

  • VISIBLE

W

  • WINDOW(R)

MySQL 8中移除关键字和保留字

以下列表显示关键字和保留字,在MySQL 5.0删除,比MySQL 5.7。保留关键字标记(R)。

  • ANALYSE

  • DES_KEY_FILE

  • PARSE_GCOL_EXPR

  • REDOFILE

  • SQL_CACHE

9.4用户定义的变量

你可以将值存储在用户定义的变量在一个声明,称其在另一项声明后。这使您可以通过从一个到另一个值的声明。

用户变量写为@var_name,在变量名var_name包含字母数字字符,_,和美元。用户变量名可以如果你引用它作为一个字符串或标识符包含其他字符(例如,@'my-var'“我是”,或@`my-var`

用户定义的变量是特定会话。用户定义的变量由一个客户端不能看到或其他客户端使用。(例外:一个用户访问性能模式user_variables_by_thread表格可以看到所有会话的所有用户变量。)对于一个给定的客户端会话的所有变量都自动释放时,退出客户端。

用户变量名不区分大小写。名称的最大长度是64个字符。

设置一个自定义变量的一种方式是通过发行SET声明:

设置”var_name=expr[,@var_name=expr]…

SET,要么=:=可以作为赋值运算符

你也可以指定一个值在报表以外的用户变量SET。在这种情况下,赋值操作符必须:=而不是=因为后者作为比较运算符=在非—SET声明:

MySQL的&#62;SET @t1=1, @t2=2, @t3:=4;MySQL的&#62;SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3;+------+------+------+--------------------+| @t1  | @t2  | @t3  | @t4 := @t1+@t2+@t3 |+------+------+------+--------------------+|    1 |    2 |    4 |                  7 |+------+------+------+--------------------+

用户可以给变量分配一个值从一组有限的数据类型:整数,小数,浮点运算,二进制或字符串,或NULL价值。小数与实际价值的分配并不保存的值的精度和规模。一个价值以外的允许类型的类型转换为允许的类型。例如,一个具有时间或空间数据类型的值转换为二进制字符串。一个很有价值的JSON数据类型转换为一个字符的字符串utf8mb4和整理utf8mb4_bin

如果一个用户变量分配一个二进制(字符)的字符串值,它具有相同的字符集和字符的字符串。用户变量的可压缩性是隐。(这是相同的可压缩性和表列值。)

十六进制或比特分配给用户变量的值被视为二进制字符串。将一个十六进制或位值作为数字用户变量,用它在数字环境。例如,添加0或使用CAST(... AS UNSIGNED)

MySQL的&#62;SET @v1 = X'41';MySQL的&#62;SET @v2 = X'41'+0;MySQL的&#62;SET @v3 = CAST(X'41' AS UNSIGNED);MySQL的&#62;SELECT @v1, @v2, @v3;——————| @ @ | V1 V2 V3 | |”——————| A | | 65 65 |——————MySQL &#62;SET @v1 = b'1000001';MySQL的&#62;SET @v2 = b'1000001'+0;MySQL的&#62;SET @v3 = CAST(b'1000001' AS UNSIGNED);MySQL的&#62;SELECT @v1, @v2, @v3;?????????| @ @ @ | | V1 V2 V3 |?????????|的| 65 65 | |?????????

如果一个用户变量的值是一个结果集的选择,它返回到客户端作为一个字符串。

如果你是一个没有初始化的变量,它的值NULL和一个字符串类型

用户可以使用变量在大多数语境中表达是允许的。这个目前不包括背景,明确要求文本值,如在LIMIT条款一SELECT声明,或忽略N线条款一LOAD DATA声明

作为一般规则,除了SET陈述,你不应该给用户变量分配一个值,在相同的声明价值。例如,增加一个变量,这是好的:

SET @a = @a + 1;

对于其他报表,如SELECT,你可能会得到你所期望的结果,但这是没有保证的。以下语句中,你可能会认为,MySQL将评估@先做一个分配二:

SELECT @a, @a:=@a+1, ...;

然而,对于涉及用户变量表达式的求值顺序是不确定的。

另一个问题与赋值给一个变量,阅读的价值相同的非内—SET表是一个变量的默认结果类型是基于语句开始时它的类型。下面的例子说明了这:

MySQL的&#62;SET @a='test';MySQL的&#62;SELECT @a,(@a:=20) FROM tbl_name;

SELECT声明中,MySQL报告给客户列一个是字符串转换的所有访问@字符串,即使“是第二行集数。后SELECT语句执行,@被视为下一个语句数

为了避免这种行为的问题,要么不指定一个值,在一个单一的声明的变量的值,或者设置变量0,或''定义它的类型在你使用它。

在一个SELECT每一个选择语句,表达式求值时,发送到客户端。这意味着,在一个GROUP BY,或顺序条款,指的是在选择表达式列表赋值变量像预期的那样工作:

mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM tbl_name HAVING b=5;

参考b条款是指在选择列表中,使用一个表达式的别名@aa。这不象预期的那样工作:@ AA的价值蕴含id从先前选定的行,而不是从当前行。

用户变量的目的是提供数据值。他们不能直接使用SQL语句中作为标识符或标识符的一部分,如在上下文中的表或数据库名称预计,或作为一个保留字,如SELECT。即使变量引用的这是真的,如下面的示例所示:

MySQL的&#62;SELECT c1 FROM t;---- | C1 | ---- | 0 | ---- | 1 | ----两排在集(0.001秒)MySQL &#62;SET @col = "c1";查询行,0行受影响(0秒)MySQL &#62;SELECT @col FROM t;------ | @西| ------ | C1 | ------ 1行集(0秒)MySQL &#62;SELECT `@col` FROM t;error unknown column(42s22 1054):@在场的列表mysql> SET @col = "`c1`";Query OK, 0 rows affected (0.00 sec)mysql>SELECT @col FROM t;------ | @西| ------ | ` C1 ` | ------ 1行集(0秒)

这一原则,用户变量不能用于标识一个例外,就是当你构建一个字符串用作制备的语句执行后。在这种情况下,用户变量可以声明的任何部分。下面的示例说明了如何可以这样做:

mysql> SET @c = "c1";
Query OK, 0 rows affected (0.00 sec)

mysql> SET @s = CONCAT("SELECT ", @c, " FROM t");
Query OK, 0 rows affected (0.00 sec)

mysql> PREPARE stmt FROM @s;
Query OK, 0 rows affected (0.04 sec)
Statement prepared

mysql> EXECUTE stmt;
+----+
| c1 |
+----+
|  0 |
+----+
|  1 |
+----+
2 rows in set (0.00 sec)

mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected (0.00 sec)

看到13.5节,“编写SQL语句语法”为更多的信息

类似的技术可用于在应用程序中使用程序变量构造SQL语句,如下所示使用PHP 5:

<?php
  $mysqli = new mysqli("localhost", "user", "pass", "test");

  if( mysqli_connect_errno() )
    die("Connection failed: %s\n", mysqli_connect_error());

  $col = "c1";

  $query = "SELECT $col FROM t";

  $result = $mysqli->query($query);

  while($row = $result->fetch_assoc())
  {
    echo "<p>" . $row["$col"] . "</p>\n";
  }

  $result->close();

  $mysqli->close();
?>

以这种方式组装SQL语句,有时被称为动态结构化查询语言

9.5表达式的语法

下面的规则定义在MySQL表达式语法。这里显示的语法是基于给定的sql/sql_yacc.yyMySQL的分布源文件。见注释有关的一些术语的语法后的附加信息。

exprexprexpr|expr| |expr|expr异或expr|exprexpr|expr&#38;expr|不expr|!expr|boolean_primary是[不] {真|假|未知} |boolean_primaryboolean_primaryboolean_primary是[不]空|boolean_primary<=>predicate|boolean_primarycomparison_operatorpredicate|boolean_primarycomparison_operator{有}(所有|subquery)|predicatecomparison_operator: = | >= | > | <= | < | <> | !=predicatebit_expr[注释]和(subquery)|bit_expr[注释]和(expr【,expr| ]…)bit_expr[不]之间bit_exprpredicate|bit_expr听起来像bit_expr|bit_expr[不]像simple_expr翼虎simple_expr| ]bit_expr[不]正则表达式bit_expr|bit_exprbit_exprbit_expr|bit_expr|bit_expr&#38;bit_expr|bit_expr<<bit_expr|bit_expr>>bit_expr|bit_expr bit_expr|bit_exprbit_expr|bit_expr*bit_expr|bit_expr/bit_expr|bit_exprDIVbit_expr|bit_expr国防部bit_expr|bit_expr%bit_expr|bit_expr^bit_expr|bit_expr interval_expr|bit_exprinterval_expr|simple_exprsimple_exprliteral|identifier|function_call|simple_expr整理collation_name|param_marker|variable|simple_expr| |simple_expr|simple_expr|—simple_expr| ~simple_expr|!simple_expr|二进制simple_expr|(expr【,expr| row()]……exprexpr【,expr] |(…)subquery| exists()subquery)| {identifierexpr} |match_expr|case_expr|interval_expr

笔记

运算符优先级,看一节,“运算符优先级”

对文学价值的语法,看第9,“文学价值”

标识符的语法,看9.2节,“架构对象名称”

变量可以是用户变量,系统变量,或存储程序的局部变量或参数:

param_marker用于准备陈述的占位符。看到第13.5.1”准备,语法”

(subquery)表示一个查询,返回一个值;即标量子查询。看到第13.2.11.1,“子查询作为Scalar Operand

{identifier expr}ODBC转义语法和被接受的ODBC兼容。的价值expr。在语法的大括号应写上;他们不是元语法作为其他语法描述。

match_expr指示MATCH表达。看到12.9节,“全文搜索功能”

case_expr指示CASE表达。看到12.4节,“控制流”功能

interval_expr在代表的时间间隔。is the syntax区间exprunit,在那里unit是一名如小时DAY,或。为完整的名单unit说明符,看到的描述DATE_ADD()功能12.7节,“戴特和时间函数”

一些运营商的意义取决于SQL模式:

  • 默认情况下,||是一个逻辑OR算子。与PIPES_AS_CONCAT启用,||是字符串连接,中间有一个优先^和一元运算符

  • 默认情况下,!有一个比较高的优先级。与HIGH_NOT_PRECEDENCE启用,!have the same值优先。

看到第5.1.10,”服务器的SQL模式”

9.6注释语法

MySQL服务器支持三种注释方式:

  • 从一个#字符到行尾

  • 从一个-- 序列到终点。在MySQL的——(双破折号)评论风格需要第二破折号应遵循由至少一个空格或控制字符(如空格,制表符,换行符,等等)。这个语法略有不同的标准SQL的注释语法,讨论第1.8.2.4,”--“开始评论”

  • 从一个/*序列如下* /序列,在C语言程序设计。这个语法允许评论扩展到多个行的开始和结束的序列,因为不需要在同一行。

下面的示例演示三评论风格:

mysql> SELECT 1+1;     # This comment continues to the end of line
mysql> SELECT 1+1;     -- This comment continues to the end of line
mysql> SELECT 1 /* this is an in-line comment */ + 1;
mysql> SELECT 1+
/*
this is a
multiple-line comment
*/
1;

不支持嵌套的注释。(在某些情况下,嵌套的注释可能是允许的,但通常都没有,用户应该避免。)

MySQL服务器支持C风格的注释的一些变种。这使您能够编写代码,包括MySQL扩展,但仍然是便携式,采用以下形式的评论:

/*! MySQL-specific code */

在这种情况下,MySQL服务器解析并执行代码的注释将任何其他SQL语句,但其他SQL服务器将忽略扩展。例如,MySQL服务器识别STRAIGHT_JOIN以下语句中的关键字,但其他的服务器将不:

选择/ *!straight_join * / 2从表1,表2…

如果你添加一个版本号!性格,在注释语法只有MySQL版本大于或等于指定的版本号执行。这个key_block_size在下面的评论关键词只有从MySQL服务器执行5.1.10或更高:

CREATE TABLE t1(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024 */;

刚才所描述的注释语法适用于如何mysqld服务器解析SQL语句。这个MySQL客户端程序也执行一些解析报表,然后将它们发送到服务器。(这是确定在多个语句的输入线。语句边界)

在这种格式的注释,/*!12345 ... */,不存储在服务器上。如果这种格式是用来存储程序的评论,评论将不会保留在服务器上。

另一个C风格的注释语法用于指定优化器提示。提示意见包括+以下的特点/ *评论的开放顺序。例子:

SELECT /*+ BKA(t1) */ FROM ... ;

有关更多信息,参见第8.9.2,“优化器提示”

短表的使用MySQL命令如\C在多线/ *…* /评论是不支持的