MySQL8 中文参考(四十一)(mysql8中文文档)

MySQL8 中文参考(四十一) 原文:docs.oracle.com/javase/tutorial/reallybigindex.html 10.14.6 复制 SQL 线程状态 原文:dev.mysql.c

原文:docs.oracle.com/javase/tutorial/reallybigindex.html

10.14.6 复制 SQL 线程状态

原文:dev.mysql.com/doc/refman/8.0/en/replica-sql-thread-states.html

以下列表显示了副本服务器上复制的SQL 线程的“状态”列中显示的最常见状态。

MySQL 8.0.26 对仪器名称进行了不兼容的更改。这包括将术语“master”更改为“source”,将“slave”更改为“replica”,并将“mts”(表示“多线程副本”)更改为“mta”(表示“多线程应用程序”)。使用这些仪器名称的监控工具可能会受到影响。如果不兼容的更改影响您,请将termination_use_previous系统变量设置为BEFORE_8_0_26,以便MySQL服务器使用上一个列表中指定的对象的旧名称。这允许依赖于旧名称的监视工具继续工作,直到它们更改为使用新名称。

要支持单个功能,请将终止_use_previous 系统变量设置为会话范围或全局范围,以便它成为所有新会话的默认值。如果您使用全局范围,慢速查询日志将包含旧版本名称。

在播放之前创建(添加)临时文件LOAD DATA INFILE

该线程执行LOAD DATA 语句以将数据附加到临时文件,该文件包含从副本读取的行的数据。

播放之前创建一个临时文件LOAD DATA INFILE

该线程正在执行LOAD DATA 语句并创建一个包含复制的读取行数据的临时文件。仅当原始LOAD DATA 语句由运行早于5.0.3 的MySQL 版本的源记录时,才会出现这种情况。

从中继日志中读取事件

线程从中继日志中读取事件,以便可以对其进行处理。

从站已读取所有中继日志并正在等待进一步更新。

MySQL 8.0.26 及更高版本:副本读取所有中继日志并等待进一步更新。

该线程已经处理了中继日志文件中的所有事件,当前正在等待I/O(接收)线程将新事件写入中继日志。

等待协调员发出的事件

使用多线程副本(replica_Parallel_workers 或SLAVE_Parallel_workers 大于1),其中一个副本工作线程等待来自协调器线程的事件。

退出时等待从属互斥体

MySQL 8.0.26 及更高版本:退出时等待副本互斥体

线程停止时出现的非常短的状态。

等待Slave Worker 释放挂起的事件

MySQL 8.0.26 及更高版本:等待复制工作线程释放待处理事件

当工作线程处理的事件总大小超过replica_pending_jobs_size_max 或smile_pending_jobs_size_max 系统变量的大小时,会发生此等待操作。一旦大小低于此限制,协调器就会恢复调度。仅当replica_Parallel_workers 或SLAVE_Parallel_workers 设置为大于0 时,才会发生此情况。

等待中继日志中的下一个事件

从中继日志读取事件之前的初始状态。

主服务器执行事件后等待MASTER_DELAY 秒

MySQL 8.0.26及更高版本:在master执行事件后等待SOURCE_DELAY秒

SQL 线程已读取事件,但正在等待复制延迟结束。此延迟由CHANGE REPLICATION SOURCE TO 语句(MySQL 8.0.23 及更高版本)或CHANGE MASTER TO 语句(MySQL 8.0.23 之前)上的SOURCE_DELAY | MASTER_DELAY 选项设置。

SQL线程信息列还可以显示语句的文本。这表明线程可能正在从中继日志中读取事件,提取其中的语句并执行它们。

10.14.7 复制连接线程状态

原文:dev.mysql.com/doc/refman/8.0/en/replica-connection-thread-states.html

这些线程状态发生在副本服务器上,但与连接线程相关,而不是I/O 或SQL 线程。

MySQL 8.0.26 对设备名称进行了不兼容的更改,包括线程阶段的名称,其中包含术语“master”,现在为“source”、“slave”、“replica”和“mts”。 (对于“多线程从站”),“mta”(对于“多线程应用程序”)。使用这些设备名称的监控工具可能会受到影响。如果不兼容的更改影响您,请将termination_use_previous系统变量设置为BEFORE_8_0_26,以强制MySQL服务器使用上面列表中指定的对象的旧版本名称。这允许依赖旧名称的监视工具继续工作,直到更新为使用新名称。

要支持单个功能,请将终止_use_previous 系统变量设置为会话范围或全局范围,以便它成为所有新会话的默认值。如果您使用全局范围,慢速查询日志将包含旧版本名称。

主改变

MySQL 8.0.26 及更高版本:更改复制源

该线程正在处理CHANGE REPLICATION SOURCE TO 语句(MySQL 8.0.23 及更高版本)或CHANGE MASTER TO 语句(MySQL 8.0.23 之前的版本)。

杀死一个奴隶

该线程正在处理STOP REPLICA 语句。

打开主转储表

从主转储创建表后会发生这种情况。

加载主转储表数据

打开主转储表后会出现这种情况。

重建主转储表索引

读取主转储表数据后会发生这种情况。

10.14.8 NDB 集群线程状态

原文:dev.mysql.com/doc/refman/8.0/en/mysql-cluster-thread-states.html

将事件发送到binlog

打开mysql.ndb_apply_status

处理事件

该线程正在处理二进制日志事件。

处理模式表中的事件

该线程正在复制架构。

关闭

同步ndb表schema操作和binlog

这用于记录NDB 模式操作的正确二进制日志记录。

ndbcluster 等待获取全局模式锁的权限

该线程正在等待获取全局模式锁的权限。

等待来自ndbcluster 的事件

服务器充当NDB集群中的SQL节点,并连接到集群管理节点。

等待来自ndbcluster 的第一个事件

等待ndbcluster 二进制日志更新到其当前位置。

ndbcluster 等待全局模式锁

该线程正在等待另一个线程持有的全局模式锁被释放。

等待ndbcluster启动

待机模式时代

该线程正在等待模式纪元(即全局检查点)。

10.14.9 事件调度器线程状态

原文:dev.mysql.com/doc/refman/8.0/en/event-scheduler-thread-states.html

这些条件发生在事件调度程序线程、用于运行调度事件的线程或终止调度程序的线程中。

清除

调度程序线程或运行事件的线程正在终止并将很快终止。

已初始化

调度程序线程或执行事件的线程已初始化。

等待下次激活

调度程序有一个非空事件队列,但下一次激活将在将来。

等待调度程序停止

该线程已发出SET GLOBALevent_scheduler=OFF 命令并正在等待调度程序停止。

等待空队列

调度程序的事件队列为空并且正在休眠。

第十一章 语言结构

原文:dev.mysql.com/doc/refman/8.0/en/language-struction.html

目录

11.1 文字值

11.1.1 字符串文字

11.1.2 数字文字值

11.1.3 日期和时间文字

11.1.4 十六进制文字

11.1.5 值文字放置文字

11.1.6 布尔文字值

11.1.7 空值

11.2 模式对象名称

11.2.1 标识符长度限制

11.2.2 标识符限定符

11.2.3 标识符的大小写敏感性

11.2.4 标识符到文件名的映射

11.2.5 函数名称解析和解析

11.3 关键字和保留字

11.4 用户定义变量

11.5 公式

11.6 查询属性

11.7 注释

本章介绍使用MySQL时以下SQL语句的编写规则:

文字,例如字符串和数字

标识符,例如数据库、表、列名等。

关键字和保留字

用户定义变量和系统变量

表达

查询属性

评论

11.1 字面值

原文:dev.mysql.com/doc/refman/8.0/en/literals.html

11.1.1 字符串文字

11.1.2 数字文字

11.1.3 日期和时间文字

11.1.4 十六进制文字

11.1.5 位值文字

11.1.6 布尔文字

11.1.7 空值

本节介绍如何在MySQL 中写入文字值。其中包括字符串、数字、十六进制值、位值、布尔值和NULL。本节还描述了使用这些基本类型时可能遇到的各种细微差别。

11.1.1 字符串文字

原文:dev.mysql.com/doc/refman/8.0/en/string-literals.html

字符串是用单引号(\’) 或双引号(\’) 字符括起来的字节或字符序列。例子:

\’细绳\’

“另一根弦”

相邻的带引号的字符串连接成一个字符串。以下几行是等效的:

\’细绳\’

\’细绳\’

当启用ANSI_QUOTES SQL 模式时,字符串文字只能用单引号引起来,因为用双引号括起来的字符串被解释为标识符。

二进制字符串是字节序列。所有二进制字符串都有一个称为二进制的字符集和排序规则。非二进制字符串是字符序列。它具有与二进制不同的字符集以及与该字符集兼容的排序规则。

对于这两种类型的字符串,比较基于每个字符串的数值。对于二进制字符串,单位是字节。字节数用于比较。对于非二进制字符串,单位是字符,部分字符集支持多字节字符,使用数字字符编码值进行比较。对字符编码进行排序是字符串匹配的一个功能。 (有关详细信息,请参阅二元排序和_bin 排序。)

消息

mysql 客户端以十六进制表示形式显示二进制字符串,具体取决于–binary-as-hex 的值。有关此选项的更多信息,请参阅mysql — MySQL 命令行客户端。

字符串文字可以包含可选的字符集指南和COLLATE 子句,以使用特定的字符集和排序规则将其指定为字符串。

[_*charset_name*]\’*string*\’ [COLLATE *排序规则名称*]

例子:

选择_latin1\’*字符串*\’;

SELECT _binary\’*字符串*\’;

选择_utf8mb4\’*string*\’ 整理utf8mb4_danish_ci;

您可以使用N\’*literal*\’(或n\’*literal*\’)来创建使用国家字符集的字符串。这些陈述是等价的。

SELECT N\’一些文本\’;

SELECT n\’一些文本\’;

选择_utf8\’文本\’;

有关这些字符串的语法形式,请参阅国家字符集和字符集读取器。

除非启用NO_BACKSLASH_ESCAPES SQL 模式,否则某些序列在字符串中具有特殊含义。这些序列以反斜杠(\\) 开头,称为转义字符。 MySQL 可识别表11.1“特殊字符转义序列”中列出的转义序列。所有其他转义序列中的反斜杠都会被忽略。也就是说,转义字符被解释为未转义字符。例如,\\x 是x。这些序列区分大小写。例如,\\b 被解释为退格键,而\\B 被解释为B。根据character_set_connection系统变量指示的字符集进行转义处理。这也适用于以指示不同字符集的前导符开头的字符串,如第12.3.6 节“字符串文字的字符集和排序规则”中所述。

表11.1 特殊字符的转义序列

转义序列中表示的字符\\0ASCII NUL(X\’00\’)字符\\\’单引号(\’)字符\\\’双引号(\’)字符\\b退格字符\\n换行符\\r回车符\\ttab字符\\ZASCII 26 (Control+Z);见表后注释\\\\反斜杠(\\)字符\\%%字符;见表后注释\\_下划线字符注释转义字符序列

ASCII 26 字符可以编码为\\Z,这样可以避免Windows 上的ASCII 26 文件结束问题。如果您的文件具有ASCII 26,则在尝试使用mysql *db_name* *file_name* 时将会遇到问题。

\\% 和\\_ 序列用于在模式匹配上下文中搜索% 和_ 的文字实例。否则,它被解释为通配符。请参阅字符串比较函数和运算符中对LIKE 运算符的描述。当\\% 或\\_ 在模式匹配上下文之外使用时,它们被解释为字符串\\% 和\\_ 而不是% 和_。

有多种方法可以在字符串中包含引号。

被\’ 包围的字符串中的\’ 可以写成\’\’。

被\’ 包围的字符串中的\’ 可以写成\’\’。

在引号前面添加转义字符(\\)。

\’ 在带引号的字符串中不需要特殊处理,也不需要加倍或转义。同样,带引号的字符串中的\’ 不需要特殊处理。

以下SELECT 语句显示了引号和转义的工作原理。

mysql SELECT \’你好\’, “你好\’\’, \’\’\’你好\’\’\’, \’hel\’\’lo\’, \’\\\’你好\’;

+———-+———-+———-+————+—– —+

| \’你好\’ |

+———-+———-+———-+————+—– —+

mysql SELECT \’你好\’, “你好\’\’, \’\’\’你好\’\’\’, \’hel\’\’lo\’, \’\\\’你好\’;

+———-+———-+———-+————+—– —+

| \’你好\’ |

+———-+———-+———-+————+—– —+

mysql SELECT \’这是\\n4\\n行\’;

+———————-+

|这个

牙齿

线|

+———————-+

mysql SELECT \’消失\\反斜杠\’;

+————————————————+

| 消失的反斜杠|

+————————————————+

要将二进制数据插入字符串列(例如BLOB 列),必须使用转义序列来表示某些字符。用于引用字符串的反斜杠(\\) 和引号字符必须进行转义。在某些客户端环境中,您可能还需要转义NUL 或Control+Z。 mysql 客户端会截断包含NUL 字符的带引号的字符串(如果它们未转义)。如果未转义,Control+Z 在Windows 上可能会被视为END-OF-FILE。有关表示每个字符的转义序列,请参阅表11.1“特殊字符转义序列”。

在编写应用程序时,可能包含这些特殊字符的字符串必须经过正确转义,然后才能用作发送到MySQL 服务器的SQL 语句中的数据值。这可以通过两种方式实现:

使用函数处理字符串并转义特殊字符。在C 程序中,您可以使用mysql_real_escape_string_quote() C API 函数转义字符。请参阅mysql_real_escape_string_quote()。 QUOTE() 函数可以在作为其他SQL 语句一部分的SQL 语句中使用。 Perl DBI 接口提供了将特殊字符转换为适当的转义序列的引用方法。请参阅MySQL Perl API。其他语言界面可以提供类似的功能。

许多MySQL API 没有显式转义特殊字符,而是提供占位符功能,允许您在语句字符串中插入特殊标记,并在发出语句时将数据值绑定到它们。在这种情况下,API 会处理值中转义的特殊字符。

11.1.2 数值文字

原文:dev.mysql.com/doc/refman/8.0/en/number-literals.html

数字文字包括精确值(整数和DECIMAL – DECIMAL、NUMERIC\’))文字和近似值(浮点)文字。

整数表示为一系列数字。数字可以包含. 作为小数点。数字可以以- 或+ 开头来表示负值或正值。用尾数和指数表示的数字是近似数字。

精确值数字文字具有整数部分、小数部分或两者。你可以签字。示例:1、2、3.4、-5、-6.78、+9.10。

近似数字文字使用尾数和指数以科学记数法表示。您可以向尾数和指数部分添加签名。示例:1.2E3、1.2E-3、-1.2E3、-1.2E-3。

两个看起来相似的数字可能被认为是不同的。例如,2.34 是精确(定点)数,但2.34E0 是近似(浮点)数。

DECIMAL – DECIMAL, NUMERIC\’) 数据类型是定点的,计算是精确的。在MySQL 中,DECIMAL – DECIMAL, NUMERIC\’) 类型有几个同义词:NUMERIC – DECIMAL, NUMERIC\’)、DEC – DECIMAL, NUMERIC\’) 和FIXED – DECIMAL, NUMERIC\’)。整数类型也是精确值类型。有关计算精确值的更多信息,请参阅精密数学。

FLOAT – FLOAT, DOUBLE\’) 和DOUBLE – FLOAT, DOUBLE\’) 数据类型是浮点类型,计算结果为近似值。在MySQL 中,FLOAT – FLOAT, DOUBLE\’) 或DOUBLE – FLOAT, DOUBLE\’) 的同义词类型是DOUBLE PRECISION – FLOAT, DOUBLE\’) 和REAL – FLOAT, DOUBLE\’)。

整数可以在浮点上下文中使用,并被解释为等效的浮点数。

11.1.3 日期和时间文字

原文:dev.mysql.com/doc/refman/8.0/en/date-and-time-literals.html

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

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

日期和时间值可以用多种格式表示,包括带引号的字符串和数字,具体取决于值的确切类型和其他因素。例如,“2015-07-21”、“20150721”和20150721 都被解释为MySQL 期望日期的上下文中的日期。

本节介绍日期和时间文字的可用格式。有关时间数据类型的详细信息(包括允许值的范围),请参阅日期和时间数据类型。

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

标准SQL 要求使用type 关键字和字符串指定时间文字。关键字和字符串之间的空格是可选的。

日期“*str*”

时间“*str*”

时间戳“*str*”

MySQL 识别但不要求标准的类SQL 类型关键字。希望遵守该标准的应用程序必须包含时间文字的type 关键字。

MySQL 还识别与标准SQL 语法相对应的ODBC 语法。

{ d \’*str*\’ }

{ t \’*str*\’ }

{ ts \’*str*\’ }

MySQL 使用type 关键字和ODBC 结构来生成带有指定尾随秒组件的DATE、TIME 和DATETIME 值。 MySQL 使用TIMESTAMP 语法生成DATETIME 值。这是因为DATETIME 的范围接近标准SQL TIMESTAMP 类型,其中年份范围为0001 到9999。 (MySQL TIMESTAMP 年份范围为1970 到2038。)

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

MySQL 识别以以下格式表示的DATE 值:

对于字符串,格式为“*YYYY-MM-DD*”或“*YY-MM-DD*”。允许使用“松散”语法,但不推荐使用。任何标点字符都可以用作日期部分之间的分隔符。例如,“2012-12-31”、“2012/12/31”、“20121231”和“2012@12@31”是等效的。从MySQL 8.0.29 开始,如果使用破折号(-) 以外的任何字符作为分隔符,您将收到类似以下内容的警告:

mysql 选择日期\’2012@12@31\’;

+—————–+

| 日期\’2012@12@31\’ |

+—————–+

| 2012-12-31 |

+—————–+

1 行一组,1 次警告(0.00 秒)

mysql 显示警告\\G

************************** 1\\. 行****************** * **********

: 级警告

代码: 4095

Message: po 分隔符“@”

sition 4 in datetime value \’2012@12@31\’ at row 1 is
deprecated. Prefer the standard \’-\’. 1 row in set (0.00 sec)
作为没有分隔符的字符串,格式为\’*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*\’。MySQL 还允许在此处使用“宽松”语法,尽管这已被弃用:任何标点字符都可以用作日期部分或时间部分之间的分隔符。例如,\’2012-12-31 11:30:45\’,\’2012¹²³¹ 11+30+45\’,\’2012/12/31 11*30*45\’和\’2012@12@31 11³⁰⁴⁵\’是等效的。从 MySQL 8.0.29 开始,在这些值中使用除了破折号(-)用于日期部分和冒号(:)用于时间部分之外的任何字符作为分隔符会引发警告,如下所示:
mysql> SELECT TIMESTAMP\’2012¹²³¹ 11*30*45\’;
+——————————–+
| TIMESTAMP\’2012¹²³¹ 11*30*45\’ |
+——————————–+
| 2012-12-31 11:30:45 |
+——————————–+
1 row in set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\\G
*************************** 1\\. row ***************************
Level: Warning
Code: 4095
Message: Delimiter \’^\’ in position 4 in datetime value \’2012¹²³¹ 11*30*45\’ at
row 1 is deprecated. Prefer the standard \’-\’. 1 row in set (0.00 sec)
日期和时间部分与小数秒部分之间唯一识别的分隔符是小数点。
日期和时间部分可以用T而不是空格分隔。例如,\’2012-12-31 11:30:45\’和\’2012-12-31T11:30:45\’是等效的。
以前,MySQL 支持日期和时间值中任意数量的前导和尾随空格字符,以及在DATETIME和TIMESTAMP值的日期和时间部分之间的空格字符。在 MySQL 8.0.29 及更高版本中,此行为已被弃用,多余的空格字符会触发警告,如下所示:
mysql> SELECT TIMESTAMP\’2012-12-31 11-30-45\’;
+———————————-+
| TIMESTAMP\’2012-12-31 11-30-45\’ |
+———————————-+
| 2012-12-31 11:30:45 |
+———————————-+
1 row in set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\\G
*************************** 1\\. row ***************************
Level: Warning
Code: 4096
Message: Delimiter \’ \’ in position 11 in datetime value \’2012-12-31 11-30-45\’
at row 1 is superfluous and is deprecated. Please remove. 1 row in set (0.00 sec)
从 MySQL 8.0.29 开始,当使用空格字符以外的空格字符时,会引发警告,如下所示:
mysql> SELECT TIMESTAMP\’2021-06-06
\’> 11:15:25\’;
+——————————–+
| TIMESTAMP\’2021-06-06
11:15:25\’ |
+——————————–+
| 2021-06-06 11:15:25 |
+——————————–+
1 row in set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\\G
*************************** 1\\. row ***************************
Level: Warning
Code: 4095
Message: Delimiter \’\\n\’ in position 10 in datetime value \’2021-06-06
11:15:25\’ at row 1 is deprecated. Prefer the standard \’ \’.
1 row in set (0.00 sec)
每个时间值只会引发一次此类警告,即使分隔符、空格或两者都存在多个问题,如下面的一系列语句所示:
mysql> SELECT TIMESTAMP\’2012!-12-31 11:30:45\’;
+———————————-+
| TIMESTAMP\’2012!-12-31 11:30:45\’ |
+———————————-+
| 2012-12-31 11:30:45 |
+———————————-+
1 row in set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\\G
*************************** 1\\. row ***************************
Level: Warning
Code: 4095
Message: Delimiter \’!\’ in position 4 in datetime value \’2012!-12-31 11:30:45\’
at row 1 is deprecated. Prefer the standard \’-\’. 1 row in set (0.00 sec)
mysql> SELECT TIMESTAMP\’2012-12-31 11:30:45\’;
+———————————+
| TIMESTAMP\’2012-12-31 11:30:45\’ |
+———————————+
| 2012-12-31 11:30:45 |
+———————————+
1 row in set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\\G
*************************** 1\\. row ***************************
Level: Warning
Code: 4096
Message: Delimiter \’ \’ in position 11 in datetime value \’2012-12-31 11:30:45\’
at row 1 is superfluous and is deprecated. Please remove. 1 row in set (0.00 sec)
mysql> SELECT TIMESTAMP\’2012-12-31 11:30:45\’;
+——————————–+
| TIMESTAMP\’2012-12-31 11:30:45\’ |
+——————————–+
| 2012-12-31 11:30:45 |
+——————————–+
1 row in set (0.00 sec)
作为没有分隔符的字符串,格式为\’*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 中小数秒支持的信息,请参见第 13.2.6 节,“时间值中的小数秒”。

包含两位数年份值的日期是模棱两可的,因为世纪未知。MySQL 使用以下规则解释两位数年份值:

年份范围在70-99之间的值变为1970-1999。
年份范围在00-69之间的值变为2000-2069。

另请参阅第 13.2.9 节,“日期中的 2 位数年份”。

对于指定为包含日期部分分隔符的字符串值,无需为小于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*格式,并且年份由前 2 位数字给出。长度不是这些之一的数字被解释为用前导零填充到最接近的长度。

指定为无分隔符字符串的值根据其长度进行解释。对于 8 或 14 个字符长的字符串,假定年份由前 4 个字符给出。否则,假定年份由前 2 个字符给出。字符串从左到右解释以找到年、月、日、小时、分钟和秒值,对于字符串中存在的部分。这意味着您不应使用少于 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*时间格式中识别尾随的小数秒部分,其中fraction是高达微秒(6 位数字)精度的小数部分。小数部分应始终用小数点与时间的其余部分分隔开;不识别其他小数秒分隔符。有关 MySQL 中小数秒支持的信息,请参见 Section 13.2.6, “Fractional Seconds in Time Values”。

对于作为包含时间部分分隔符的字符串指定的TIME值,不需要为小时、分钟或秒值少于10的两位数指定两位数。\’8:3:2\’等同于\’08:03:02\’。

从 MySQL 8.0.19 开始,您可以在将TIMESTAMP和DATETIME值插入表时指定时区偏移量。偏移量附加到日期时间文字的时间部分,没有空格,并使用用于设置time_zone系统变量的相同格式,以下是一些例外情况:

对于小时值小于 10 的情况,需要前导零。
值\’-00:00\’被拒绝。
诸如\’EET\’和\’Asia/Shanghai\’之类的时区名称不能使用;在这种情况下也不能使用\’SYSTEM\’。

插入的值不能在月份部分、日期部分或两部分中有零。从 MySQL 8.0.22 开始执行此规则,无论服务器 SQL 模式设置如何。

这个例子演示了使用不同的time_zone设置将带有时区偏移的日期时间值插入TIMESTAMP和DATETIME列,然后检索它们:

mysql> CREATE TABLE ts (
-> id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> col TIMESTAMP NOT NULL
-> ) AUTO_INCREMENT = 1;
mysql> CREATE TABLE dt (
-> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> col DATETIME NOT NULL
-> ) AUTO_INCREMENT = 1;
mysql> SET @@time_zone = \’SYSTEM\’;
mysql> INSERT INTO ts (col) VALUES (\’2020-01-01 10:10:10\’),
-> (\’2020-01-01 10:10:10+05:30\’), (\’2020-01-01 10:10:10-08:00\’);
mysql> SET @@time_zone = \’+00:00\’;
mysql> INSERT INTO ts (col) VALUES (\’2020-01-01 10:10:10\’),
-> (\’2020-01-01 10:10:10+05:30\’), (\’2020-01-01 10:10:10-08:00\’);
mysql> SET @@time_zone = \’SYSTEM\’;
mysql> INSERT INTO dt (col) VALUES (\’2020-01-01 10:10:10\’),
-> (\’2020-01-01 10:10:10+05:30\’), (\’2020-01-01 10:10:10-08:00\’);
mysql> SET @@time_zone = \’+00:00\’;
mysql> INSERT INTO dt (col) VALUES (\’2020-01-01 10:10:10\’),
-> (\’2020-01-01 10:10:10+05:30\’), (\’2020-01-01 10:10:10-08:00\’);
mysql> SET @@time_zone = \’SYSTEM\’;
mysql> SELECT @@system_time_zone;
+——————–+
| @@system_time_zone |
+——————–+
| EST |
+——————–+
mysql> SELECT col, UNIX_TIMESTAMP(col) FROM dt ORDER BY id;
+———————+———————+
| col | UNIX_TIMESTAMP(col) |
+———————+———————+
| 2020-01-01 10:10:10 | 1577891410 |
| 2019-12-31 23:40:10 | 1577853610 |
| 2020-01-01 13:10:10 | 1577902210 |
| 2020-01-01 10:10:10 | 1577891410 |
| 2020-01-01 04:40:10 | 1577871610 |
| 2020-01-01 18:10:10 | 1577920210 |
+———————+———————+
mysql> SELECT col, UNIX_TIMESTAMP(col) FROM ts ORDER BY id;
+———————+———————+
| col | UNIX_TIMESTAMP(col) |
+———————+———————+
| 2020-01-01 10:10:10 | 1577891410 |
| 2019-12-31 23:40:10 | 1577853610 |
| 2020-01-01 13:10:10 | 1577902210 |
| 2020-01-01 05:10:10 | 1577873410 |
| 2019-12-31 23:40:10 | 1577853610 |
| 2020-01-01 13:10:10 | 1577902210 |
+———————+———————+

即使在插入时使用了偏移量,选择日期时间值时也不显示偏移量。

支持的偏移值范围是-13:59到+14:00,包括边界值。

包含时区偏移的日期时间文字可以作为预处理语句的参数值接受。

11.1.4 十六进制文字

译文:dev.mysql.com/doc/refman/8.0/en/hexadecimal-literals.html

十六进制文字值使用 X\’*val*\’ 或 0x*val* 表示法编写,其中 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)

使用包含奇数个数字的 0x*val* 表示法编写的值被视为具有额外的前导 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 子句,以指定其为使用特定字符集和排序规则的字符串:

[_*charset_name*] X\’*val*\’ [COLLATE *collation_name*]

示例:

SELECT _latin1 X\’4D7953514C\’;
SELECT _utf8mb4 0x4D7953514C COLLATE utf8mb4_danish_ci;

示例使用 X\’*val*\’ 表示法,但 0x*val* 表示法也允许引导符。有关引导符的信息,请参阅 Section 12.3.8, “Character Set Introducers”。

在数值上下文中,MySQL 将十六进制文字视为 BIGINT UNSIGNED(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 |
+———–+

对于十六进制文字,位操作被视为数值上下文,但在 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);
+———-+———-+
| HEX(@v1) | HEX(@v2) |
+———-+———-+
| BCD | 0BCD |
+———-+———-+

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

11.1.5 位值字面量

原文:dev.mysql.com/doc/refman/8.0/en/bit-value-literals.html

位值字面量使用b\’*val*\’或0b*val*表示法编写。*val*是使用零和一写成的二进制值。任何前导b的大小写不重要。前导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 _utf8mb4 0b1000001 COLLATE utf8mb4_danish_ci;

示例中使用b\’*val*\’表示法,但0b*val*表示法也允许引导符。有关引导符的信息,请参见第 12.3.8 节,“字符集引导符”。

在数字上下文中,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列的值:

mysql> CREATE TABLE t (b BIT(8));
mysql> INSERT INTO t SET b = b\’11111111\’;
mysql> INSERT INTO t SET b = b\’1010\’;
mysql> INSERT INTO t SET b = b\’0101\’;

结果集中的位值以二进制形式返回,可能显示不佳。要将位值转换为可打印形式,请在数字上下文中使用它或使用诸如BIN()或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 |
+——+———-+——–+——–+

对于位字面量,位操作被视为数字上下文,但在 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 |
+———-+———-+

显示的结果对于位操作来说看起来相似,但没有_binary的结果是一个BIGINT值,而有_binary的结果是一个二进制字符串。由于结果类型的差异,显示的值不同:转换后的值中不显示高阶 0 位。

11.1.6 布尔字面值

原文:dev.mysql.com/doc/refman/8.0/en/boolean-literals.html

常量TRUE和FALSE分别求值为1和0。常量名称可以以任何大小写形式编写。

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

11.1.7 NULL Values

原文:dev.mysql.com/doc/refman/8.0/en/null-values.html

NULL 值表示“无数据”。NULL 可以以任何大小写形式编写。

请注意,NULL 值与数值类型的 0 或字符串类型的空字符串等值是不同的。有关更多信息,请参见 Section B.3.4.3, “Problems with NULL Values”。

对于使用 LOAD DATA 或 SELECT … INTO OUTFILE 执行的文本文件导入或导出操作,NULL 由 \\N 序列表示。参见 Section 15.2.9, “LOAD DATA Statement”。

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

11.2 模式对象名称

原文:dev.mysql.com/doc/refman/8.0/en/identifiers.html

11.2.1 标识符长度限制

11.2.2 标识符限定符

11.2.3 标识符大小写敏感性

11.2.4 标识符映射到文件名

11.2.5 函数名称解析和解析

MySQL 中的某些对象,包括数据库、表、索引、列、别名、视图、存储过程、分区、表空间、资源组和其他对象名称被称为标识符。本节描述了 MySQL 中标识符的允许语法。第 11.2.1 节,“标识符长度限制”指示了每种类型标识符的最大长度。第 11.2.3 节,“标识符大小写敏感性”描述了哪些类型的标识符是区分大小写的以及在什么条件下。

标识符可以被引用或未引用。如果标识符包含特殊字符或是保留字,您在引用时必须对其进行引用。(例外情况:在限定名称中跟在句点后面的保留字必须是标识符,因此不需要引用。)保留字列在第 11.3 节,“关键字和保留字”中。

在内部,标识符被转换为并存储为 Unicode(UTF-8)。标识符中允许的 Unicode 字符是基本多文种平面(BMP)中的字符。不允许使用补充字符。因此,标识符可能包含这些字符:

未引用标识符中允许的字符:

ASCII:[0-9,a-z,A-Z$_](基本拉丁字母、数字 0-9、美元符号、下划线)
扩展字符集:U+0080 … U+FFFF
引用标识符中允许的字符包括完整的 Unicode 基本多文种平面(BMP),除了 U+0000:

ASCII:U+0001 … U+007F
扩展字符集:U+0080 … U+FFFF
ASCII NUL(U+0000)和补充字符(U+10000 及更高)不允许在引用或未引用的标识符中使用。
标识符可以以数字开头,但除非引用,不能完全由数字组成。
数据库、表和列名称不能以空格字符结尾。
从 MySQL 8.0.32 开始,将美元符号作为未引用的数据库、表、视图、列、存储程序或别名名称的第一个字符已被弃用,并会产生警告。这包括与限定符一起使用的名称(参见第 11.2.2 节,“标识符限定符”)。当按照本节后面给出的规则引用时,美元符号仍然可以用作此类标识符的前导字符。

��识符引用字符是反引号(“`sql):

mysql> SELECT * FROM `select` WHERE `select`.id > 100;
“`sql
If the `ANSI_QUOTES` SQL mode is enabled, it is also permissible to quote identifiers within double quotation marks:

mysql> CREATE TABLE “test” (col INT);

错误 1064:您的 SQL 语法中存在错误…

mysql> SET sql_mode=‘ANSI_QUOTES’;

mysql> CREATE TABLE “test” (col INT);

查询成功,影响行数为 0(0.00 秒)

The `ANSI_QUOTES` mode causes the server to interpret double-quoted strings as identifiers. Consequently, when this mode is enabled, string literals must be enclosed within single quotation marks. They cannot be enclosed within double quotation marks. The server SQL mode is controlled as described in Section 7.1.11, “Server SQL Modes”.
Identifier quote characters can be included within an identifier if you quote the identifier. If the character to be included within the identifier is the same as that used to quote the identifier itself, then you need to double the character. The following statement creates a table named `a`b` that contains a column named `c\”d`:

mysql> CREATE TABLE a“b (c\”d INT);

In the select list of a query, a quoted column alias can be specified using identifier or string quoting characters:

mysql> SELECT 1 AS one, 2 AS ‘two’;

±—-±—-+

onetwo
±—-±—-+

12
±—-±—-+

在语句的其他地方,对别名的引用必须使用标识符引用,否则引用将被视为字符串文字。
建议不要使用以 `*`M`*e` 或 `*`M`*e*`N`*` 开头的名称,其中 *`M`* 和 *`N`* 是整数。例如,避免使用 `1e` 作为标识符,因为诸如 `1e+3` 这样的表达式是模棱两可的。根据上下文,它可能被解释为表达式 `1e + 3` 或数字 `1e+3`。
在使用 `MD5()` 生成表名时要小心,因为它可能生成类似于刚才描述的非法或模棱两可的格式的名称。
还建议不要使用以 `!hidden!` 开头的列名,以确保新名称不会与现有隐藏列用于功能索引的名称发生冲突。
用户变量不能直接用作 SQL 语句中的标识符或标识符的一部分。请参阅第 11.4 节,“用户定义变量”,了解更多信息和解决方法的示例。
数据库和表名中的特殊字符在相应的文件系统名称中进行编码,如第 11.2.4 节,“标识符映射到文件名”中所述。
# 11.2.1 标识符长度限制
> 原文:[`dev.mysql.com/doc/refman/8.0/en/identifier-length.html`](https://dev.mysql.com/doc/refman/8.0/en/identifier-length.html)
以下表描述了每种标识符类型的最大长度。
| 标识符类型 | 最大长度(字符) |
| — | — |
| 数据库 | 64(包括 NDB Cluster 8.0.18 及更高版本) |
| 表 | 64(包括 NDB Cluster 8.0.18 及更高版本) |
| 列 | 64 |
| 索引 | 64 |
| 约束 | 64 |
| 存储过程 | 64 |
| 视图 | 64 |
| 表空间 | 64 |
| 服务器 | 64 |
| 日志文件组 | 64 |
| 别名 | 256(见表后的例外) |
| 复合语句标签 | 16 |
| 用户定义变量 | 64 |
| 资源组 | 64 |
| 标识符类型 | 最大长度(字符) |
在`CREATE VIEW`语句中,列名的别名将与最大列长度为 64 个字符进行检查(而不是最大别名长度为 256 个字符)。
对于不包含约束名称的约束定义,服务器内部生成一个从关联表名派生的名称。例如,内部生成的外键和`CHECK`约束名称由表名加上 `_ibfk_` 或 `_chk_` 和一个数字组成。如果表名接近约束名称的长度限制,那么约束名称所需的额外字符可能导致该名称超过限制,从而导致错误。
标识符使用 Unicode(UTF-8)进行存储。这适用于表定义中的标识符以及存储在 `mysql` 数据库的授权表中的标识符。授权表中的标识符字符串列的大小以字符为单位。您可以使用多字节字符,而不会减少这些列中存储的值所允许的字符数。
在 NDB 8.0.18 之前,NDB Cluster 对数据库和表的名称 imposed 了最大长度为 63 个字符的限制。从 NDB 8.0.18 开始,此限制被移除。请参阅 Section 25.2.7.11, “Previous NDB Cluster Issues Resolved in NDB Cluster 8.0”。
MySQL 账户名称中的用户名称和主机名等值是字符串,而不是标识符。有关存储在授权表中的这些值的最大长度的信息,请参阅 Grant Table Scope Column Properties。
# 11.2.2 标识符限定符
> 原文:[`dev.mysql.com/doc/refman/8.0/en/identifier-qualifiers.html`](https://dev.mysql.com/doc/refman/8.0/en/identifier-qualifiers.html)
对象名称可以是未限定的或限定的。在名称解释明确的情况下,可以使用未限定名称。限定名称包括至少一个限定符,以通过覆盖默认上下文或提供缺失上下文来澄清解释上下文。
例如,此语句使用未限定名称`t1`创建表:
“`sql
CREATE TABLE t1 (i INT);

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

此语句使用限定名db1.t1创建表:

CREATE TABLE db1.t1 (i INT);

因为db1.t1包含数据库限定符db1,该语句在名为db1的数据库中创建t1,而不管默认数据库如何。如果没有默认数据库,则必须指定限定符。如果有默认数据库,则可以指定限定符,以指定与默认数据库不同的数据库,或者如果默认数据库与指定的数据库相同,则明确指定数据库。

限定符具有以下特点:

未限定名称由单个标识符组成。限定名称由多个标识符组成。
多部分名称的组件必须用句点(.)字符分隔。多部分名称的初始部分充当限定符,影响解释最终标识符的上下文。
限定符字符是一个单独的标记,不需要与相关标识符连续。例如,*tbl_name.col_name和tbl_name . col_name*是等效的。
如果多部分名称的任何组件需要引号,请单独引用它们,而不是整体引用名称。例如,写成my-table`.`my-column,而不是my-table.my-column。
在限定名中跟在句点后面的保留字必须是标识符,因此在该上下文中不需要引号。

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

数据库名称是完全限定的,不需要限定符:
CREATE DATABASE db1;
表、视图或存储程序名称可以给定数据库名称限定符。在CREATE语句中的未限定和限定名称示例:
CREATE TABLE mytable …;
CREATE VIEW myview …;
CREATE PROCEDURE myproc …;
CREATE FUNCTION myfunc …;
CREATE EVENT myevent …;
CREATE TABLE mydb.mytable …;
CREATE VIEW mydb.myview …;
CREATE PROCEDURE mydb.myproc …;
CREATE FUNCTION mydb.myfunc …;
CREATE EVENT mydb.myevent …;
触发器与表相关联,因此任何限定符都适用于表名:
CREATE TRIGGER mytrigger … ON mytable …;
CREATE TRIGGER mytrigger … ON mydb.mytable …;
列名可以给定多个限定符,以指示在引用它的语句中的上下文,如下表所示。

列引用含义col_name语句中使用的任何表中包含具有该名称的列的列*col_name*tbl_name.col_name来自默认数据库表*tbl_name的列col_name*db_name.tbl_name.col_name来自数据库*db_name的表tbl_name的列col_name*换句话说,列名可以被赋予表名限定符,而表名本身可以被赋予数据库名限定符。在SELECT语句中的未限定和限定列引用的示例:
SELECT c1 FROM mytable
WHERE c2 > 100;
SELECT mytable.c1 FROM mytable
WHERE mytable.c2 > 100;
SELECT mydb.mytable.c1 FROM mydb.mytable
WHERE mydb.mytable.c2 > 100;

除非未限定引用是模棱两可的,否则在语句中不需要为对象引用指定限定符。假设列c1仅出现在表t1中,c2仅在t2中,c在t1和t2中都有。在引用这两个表的语句中,对c的任何未限定引用都是模棱两可的,必须限定为t1.c或t2.c以指示你指的是哪个表:

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

同样地,在同一语句中从数据库db1的表t和数据库db2的表t中检索数据时,必须对表引用进行限定:对于这些表中的列名的引用,只有在两个表中都出现的列名需要限定。假设列c1仅出现在表db1.t中,c2仅在db2.t中,c在db1.t和db2.t中都有。在这种情况下,c是模棱两可的,必须进行限定,但c1和c2则不需要:

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;

11.2.3 标识符大小写敏感性

原文:dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html

在 MySQL 中,数据库对应于数据目录中的目录。数据库中的每个表对应于数据库目录中的至少一个文件(根据存储引擎可能还有更多)。触发器也对应于文件。因此,底层操作系统的大小写敏感性在数据库、表和触发器名称的大小写敏感性中起作用。这意味着在 Windows 中这些名称不区分大小写,但在大多数 Unix 变体中是区分大小写的。一个值得注意的例外是 macOS,它基于 Unix 但使用的默认文件系统类型(HFS+)不区分大小写。但是,macOS 也支持大小写敏感的 UFS 卷,就像在任何 Unix 上一样。参见第 1.6.1 节,“MySQL 对标准 SQL 的扩展”。lower_case_table_names系统变量还影响服务器处理标识符大小写敏感性的方式,如本节后面所述。

注意

虽然在某些平台上数据库、表和触发器名称不区分大小写,但在同一语句中不应该使用不同大小写来引用其中之一。以下语句不起作用,因为它既引用了表my_table又引用了MY_TABLE:

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

分区、子分区、列、索引、存储过程、事件和资源组名称在任何平台上都不区分大小写,列别名也是如此。

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

默认情况下,在 Unix 上表别名区分大小写,但在 Windows 或 macOS 上不是。以下语句在 Unix 上不起作用,因为它既引用了别名a又引用了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_names的默认值为 0。在 Windows 上,默认值为 1。在 macOS 上,默认值为 2。

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

值含义0表和数据库名称在磁盘上使用CREATE TABLE或CREATE DATABASE语句中指定的大小写形式存储。名称比较区分大小写。如果你在具有不区分大小写文件名的系统上运行 MySQL(如 Windows 或 macOS),不应将此变量设置为 0。如果你在不区分大小写的文件系统上强制将此变量设置为 0,并使用不同大小写访问MyISAM表名,可能会导致索引损坏。1表名在磁盘上以小写形式存储,名称比较不区分大小写。MySQL 在存储和查找时将所有表名转换为小写。这种行为也适用于数据库名称和表别名。2表和数据库名称在磁盘上使用CREATE TABLE或CREATE DATABASE语句中指定的大小写形式存储,但 MySQL 在查找时将它们转换为小写。名称比较不区分大小写。这仅适用于不区分大小写的文件系统!InnoDB表名和视图名以小写形式存储,就像lower_case_table_names=1一样。
如果你只在一个平台上使用 MySQL,通常不需要使用除默认值以外的lower_case_table_names设置。但是,如果你想在文件系统大小写敏感性不同的平台之间传输表格时可能会遇到困难。例如,在 Unix 上,你可以有两个不同的表格命名为my_table和MY_TABLE,但在 Windows 上这两个名称被视为相同。为了避免由数据库或表名大小写引起的数据传输问题,你有两个选择:

在所有系统上使用lower_case_table_names=1。这样做的主要缺点是,当你使用SHOW TABLES或SHOW DATABASES时,你看不到原始大小写的名称。
在 Unix 上使用lower_case_table_names=0,在 Windows 上使用lower_case_table_names=2。这将保留数据库和表名称的大小写。这样做的缺点是,您必须确保在 Windows 上始终使用正确的大小写引用您的数据库和表名称。如果您将您的语句转移到大小写敏感的 Unix 系统,如果大小写不正确,它们将无法正常工作。
异常:如果您正在使用InnoDB表,并且正在尝试避免这些数据传输问题,您应该在所有平台上使用lower_case_table_names=1来强制将名称转换为小写。

如果根据二进制排序规则,对象名称的大写形式相等,则可能被视为重复。这适用于游标、条件、存储过程、函数、保存点、存储过程参数、存储程序局部变量和插件的名称。但对于列、约束、数据库、分区、使用PREPARE准备的语句、表、触发器、用户和用户定义变量的名称则不适用。

文件系统的大小写敏感性可能会影响INFORMATION_SCHEMA表中字符串列的搜索。有关更多信息,请参见第 12.8.7 节,“在 INFORMATION_SCHEMA 搜索中使用排序规则”。

11.2.4 标识符到文件名的映射

原文:dev.mysql.com/doc/refman/8.0/en/identifier-mapping.html

数据库和表标识符与文件系统中的名称之间存在对应关系。对于基本结构,MySQL 将每个数据库表示为数据目录中的一个目录,根据存储引擎的不同,每个表可能由适当数据库目录中的一个或多个文件表示。

对于数据和索引文件,在磁盘上的确切表示是特定于存储引擎的。这些文件可以存储在���据库目录中,或者���息可以存储在单独的文件中。InnoDB 数据存储在 InnoDB 数据文件中。如果您正在使用 InnoDB 的表空间,则将使用您创建的特定表空间文件。

除 ASCII NUL (X\’00\’) 外,数据库或表标识符中的任何字符都是合法的。当 MySQL 创建数据库目录或表文件时,会对任何在相应文件系统对象中有问题的字符进行编码:

基本拉丁字母(a..zA..Z)、数字(0..9)和下划线(_)按原样编码。因此,它们的大小写敏感性直接取决于文件系统特性。
所有其他具有大写/小写映射的字母表的国家字母都按照以下表格中所示的方式进行编码。代码范围列中的值是 UCS-2 值。

Code RangePatternNumberUsedUnusedBlocks00C0…017F[@][0…4][g…z]5*20= 100973拉丁-1 补充 + 拉丁扩展-A0370…03FF[@][5…9][g…z]5*20= 1008812希腊语和科普特语0400…052F[@][g…z][0…6]20*7= 1401373西里尔字母 + 西里尔字母补充0530…058F[@][g…z][7…8]20*2= 40382亚美尼亚语2160…217F[@][g…z][9]20*1= 20164数字形式0180…02AF[@][g…z][a…k]20*11=22020317拉丁扩展-B + 国际音标扩展1E00…1EFF[@][g…z][l…r]20*7= 1401364拉丁语扩展附加1F00…1FFF[@][g…z][s…z]20*8= 16014416希腊语扩展… …[@][a…f][g…z]6*20= 1200120保留24B6…24E9[@][@][a…z]26260封闭字母数字FF21…FF5A[@][a…z][@]26260半角和全角形式Code RangePatternNumberUsedUnusedBlocks序列中的一个字节编码了大小写。例如:LATIN CAPITAL LETTER A WITH GRAVE 被编码为 @0G,而 LATIN SMALL LETTER A WITH GRAVE 被编码为 @0g。这里的第三个字节(G 或 g)表示大小写。(在不区分大小写的文件系统中,这两个字母被视为相同。)
对于某些块,如西里尔字母,第二个字节确定大小写。对于其他块,如 Latin1 补充,第三个字节确定大小写。如果序列中的两个字节是字母(如希腊扩展中),最左边的字母字符代表大小写。所有其他字母字节必须是小写。
除了下划线(_)之外的所有非字母字符,以及没有大写/小写映射的字母(如希伯来语)都使用十六进制表示法编码,使用小写字母表示十六进制数字a..f:
0x003F -> @003f
0xFFFF -> @ffff
十六进制值对应于ucs2双字节字符集中的字符值。

在 Windows 上,一些名称,如nul、prn和aux,在服务器创建相应的文件或目录时,通过在名称后附加@@@进行编码。这在所有平台上都会发生,以便在平台之间移植相应的数据库对象。

以下名称是保留名称,如果在模式或表名中使用,则附加@@@:

CON
PRN
AUX
NUL
COM1 到 COM9
LPT1 到 LPT9

CLOCK$ 也是这组保留名称的成员之一,但不是附加@@@,而是用@0024代替。也就是说,如果将 CLOCK$ 用作模式或表名,它将被写入文件系统为CLOCK@0024。对于模式或表名中任何使用 $(美元符号)的情况也是如此;在文件系统中,它将被替换为@0024。

注意

这些名称也以它们的附加形式写入INNODB_TABLES,但以用户输入的未附加形式写入TABLES。

11.2.5 函数名称解析和解析

原文:dev.mysql.com/doc/refman/8.0/en/function-resolution.html

MySQL 支持内置(本地)函数、可加载函数和存储函数。本节描述了服务器如何识别内置函数的名称是作为函数调用还是作为标识符使用,以及在存在具有给定名称的不同类型函数时服务器如何确定使用哪个函数。

内置函数名称解析
函数名称解析

内置函数名称解析

解析器使用默认规则解析内置函数的名称。这些规则可以通过启用IGNORE_SPACE SQL 模式来更改。

当解析器遇到内置函数名称时,必须确定该名称是表示函数调用还是非表达式引用标识符(例如表或列名称)。例如,在以下语句中,对count的第一个引用是函数调用,而第二个引用是表名:

SELECT COUNT(*) FROM mytable;
CREATE TABLE count (i INT);

解析器应仅在解析预期为表达式的内容时将内置函数名称识别为表示函数调用。也就是说,在非表达式上下文中,函数名称允许作为标识符。

然而,一些内置函数具有特殊的解析或实现考虑因素,因此解析器默认使用以下规则来区分它们的名称是作为函数调用还是作为非表达式上下文中的标识符:

要在表达式中使用名称作为函数调用,名称和后面的(括号字符之间不能有空格。
相反,要将函数名称用作标识符,必须不紧跟在括号后面。

要求函数调用在名称和括号之间没有空格的规定仅适用于具有特殊考虑因素的内置函数。COUNT就是这样一个名称。sql/lex.h源文件列出了这些特殊函数的名称,后续空格决定了它们的解释:由symbols[]数组中的SYM_FN()宏定义的名称。

下面列出了在 MySQL 8.0 中受IGNORE_SPACE设置影响并在sql/lex.h源文件中列为特殊的函数列表。您可能会发现将无空格要求视为适用于所有函数调用最容易。

ADDDATE
BIT_AND
BIT_OR
BIT_XOR
CAST
COUNT
CURDATE
CURTIME
DATE_ADD
DATE_SUB
EXTRACT
GROUP_CONCAT
MAX
MID
MIN
NOW
POSITION
SESSION_USER
STD
STDDEV
STDDEV_POP
STDDEV_SAMP
SUBDATE
SUBSTR
SUBSTRING
SUM
SYSDATE
SYSTEM_USER
TRIM
VARIANCE
VAR_POP
VAR_SAMP

对于在sql/lex.h中未列为特殊的函数,空格并不重要。只有在表达式上下文中使用时,它们才会被解释为函数调用,否则可以自由地用作标识符。ASCII就是这样一个名称。然而,对于这些未受影响的函数名称,在表达式上下文中的解释可能有所不同:如果存在具有给定名称的内置函数,则*func_name* ()将被解释为内置函数;如果没有,则*func_name* ()将被解释为可加载函数或存储函数(如果存在具有该名称的函数)。

IGNORE_SPACE SQL 模式可用于修改解析器对对空格敏感的函数名称的处理方式:

禁用IGNORE_SPACE后,当函数名称和后续括号之间没有空格时,解析器将名称解释为函数调用。即使在非表达式上下文中使用函数名称也会发生这种情况:
mysql> CREATE TABLE count(i INT);
ERROR 1064 (42000): You have an error in your SQL syntax …
near \’count(i INT)\’
为了消除错误并使名称被视为标识符,可以在名称后面使用空格或将其写为带引号的标识符(或两者都使用):
CREATE TABLE count (i INT);
CREATE TABLE `count`(i INT);
CREATE TABLE `count` (i INT);
启用IGNORE_SPACE后,解析器放宽了函数名称和后续括号之间不能有空格的要求。这样可以更灵活地编写函数调用。例如,以下任一函数调用都是合法的:
SELECT COUNT(*) FROM mytable;
SELECT COUNT (*) FROM mytable;
然而,启用IGNORE_SPACE也会导致解析器将受影响的函数名称视为保留字(请参阅第 11.3 节,“关键字和保留字”)。这意味着名称后面的空格不再表示其用作标识符。该名称可以在带有或不带有后续空格的函数调用中使用,但在非表达式上下文中除非加引号,否则会导致语法错误。例如,启用IGNORE_SPACE后,以下两个语句都会因解析器将count解释为保留字而导致语法错误:
CREATE TABLE count(i INT);
CREATE TABLE count (i INT);
要在非表达式上下文中使用函数名称,请将其写为带引号的标识符:
CREATE TABLE `count`(i INT);
CREATE TABLE `count` (i INT);

要启用IGNORE_SPACE SQL 模式,请使用以下语句:

SET sql_mode = \’IGNORE_SPACE\’;

IGNORE_SPACE也被某些其他复合模式启用,例如ANSI将其包含在其值中:

SET sql_mode = \’ANSI\’;

查看第 7.1.11 节,“服务器 SQL 模式”,以查看哪些复合模式启用了IGNORE_SPACE。

为了最大程度地减少 SQL 代码对IGNORE_SPACE设置的依赖,请遵循以下准则:

避免创建与内置函数同名的���加载函数或存储函数。
避免在非表达式上下文中使用函数名。例如,这些语句使用了 count(受 IGNORE_SPACE 影响的函数名之一),因此如果启用了 IGNORE_SPACE,无论名称后是否有空格,它们都会失败:
CREATE TABLE count(i INT);
CREATE TABLE count (i INT);
如果必须在非表达式上下文中使用函数名,请将其写为引号标识符:
CREATE TABLE `count`(i INT);
CREATE TABLE `count` (i INT);

函数名解析

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

内置函数和可加载函数
如果尝试创建与内置函数同名的可加载函数,则会出现错误。
IF NOT EXISTS(从 MySQL 8.0.29 开始提供)在这种情况下没有效果。有关更多信息,请参阅 Section 15.7.4.1, “CREATE FUNCTION Statement for Loadable Functions”。
内置函数和存储函数
可以创建与内置函数同名的存储函数,但要调用存储函数,必须使用模式名称进行限定。例如,如果在 test 模式中创建了名为 PI 的存储函数,则调用时应为 test.PI(),因为服务器会将不带限定符的 PI() 解析为对内置函数的引用。如果存储函数名与内置函数名冲突,服务器会生成警告。可以使用 SHOW WARNINGS 显示警告。
IF NOT EXISTS(MySQL 8.0.29 及更高版本)在这种情况下没有效果;请参阅 Section 15.1.17, “CREATE PROCEDURE and CREATE FUNCTION Statements”。
可加载函数和存储函数
可以创建与现有可加载函数同名的存储函数,反之亦然。如果建议的存储函数名与现有可加载函数名冲突,或者建议的可加载函数名与现有存储函数名相同,则服务器会生成警告。在这两种情况下,一旦两个函数都存在,以后在调用存储函数时必须使用模式名称进行限定;在这种情况下,服务器假定未限定的名称指的是可加载函数。
从 MySQL 8.0.29 开始,IF NOT EXISTS 在 CREATE FUNCTION 语句中得到支持,但在这种情况下没有效果。
在 MySQL 8.0.28 之前,可以创建与现有可加载函数同名的存储函数,但反之则不行(Bug #33301931)。

前述函数名解析规则对于升级到实现新内置函数的 MySQL 版本具有影响:

如果您已经创建了一个具有特定名称的可加载函数,并将 MySQL 升级到实现了同名新内置函数的版本,则该可加载函数将变得无法访问。为了纠正这个问题,使用 DROP FUNCTION 删除可加载函数,然后使用 CREATE FUNCTION 以不冲突的不同名称重新创建可加载函数。然后修改任何受影响的代码以使用新名称。
如果 MySQL 的新版本实现了一个与现有存储函数同名的内置函数或可加载函数,你有两个选择:将存储函数重命名为不冲突的名称,或者修改任何尚未这样做的对该函数的调用以使用模式限定符(*schema_name*.*func_name*() 语法)。在任何情况下,相应地修改任何受影响的代码。

11.3 关键字和保留字

原文:dev.mysql.com/doc/refman/8.0/en/keywords.html

关键字是在 SQL 中具有重要意义的单词。 某些关键字,例如SELECT,DELETE或BIGINT,是保留的,需要特殊处理才能用作标识符,例如表和列名。 对于内置函数的名称也可能是如此。

非保留关键字可以作为标识符而无需引用。 如果引用它们如第 11.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 和 END 是关键字但不是保留字,因此它们作为标识符的使用不需要引用。 INTERVAL 是一个保留关键字,必须引用才能用作标识符:

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

例外:在限定名称中跟在句点后面的单词必须是标识符,因此即使它是保留字,也不需要引用:

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

内置函数的名称可以作为标识符,但可能需要小心使用。 例如,COUNT 可以作为列名。 但是,默认情况下,在函数名称和后续(字符之间不允许有空格。 此要求使解析器能够区分名称是在函数调用中使用还是在非函数上下文中使用。 有关函数名称识别的更多详细信息,请参阅第 11.2.5 节,“函数名称解析和解析”。

INFORMATION_SCHEMA.KEYWORDS 表列出了 MySQL 认为是关键字的单词,并指示它们是否是保留字。 请参阅第 28.3.17 节,“INFORMATION_SCHEMA KEYWORDS 表”。

MySQL 8.0 关键字和保留字
MySQL 8.0 新关键字和保留字
MySQL 8.0 已移除的关键字和保留字

MySQL 8.0 关键字和保留字

下面的列表显示了 MySQL 8.0 中的关键字和保留字,以及从版本到版本的单词更改。 保留关键字用(R)标记。此外,_FILENAME 是保留的。

在某个时候,您可能会升级到更高版本,因此查看未来保留字也是一个好主意。您可以在涵盖更高版本 MySQL 的手册中找到这些内容。列���中的大多数保留字被标准 SQL 禁止用作列或表名(例如,GROUP)。有一些是保留的,因为 MySQL 需要它们并使用yacc解析器。

A | 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

A

ACCESSIBLE ®
ACCOUNT
ACTION
ACTIVE; added in 8.0.14 (nonreserved)
ADD ®
ADMIN; became nonreserved in 8.0.12
AFTER
AGAINST
AGGREGATE
ALGORITHM
ALL ®
ALTER ®
ALWAYS
ANALYSE; removed in 8.0.1
ANALYZE ®
AND ®
ANY
ARRAY; added in 8.0.17 (reserved); became nonreserved in 8.0.19
AS ®
ASC ®
ASCII
ASENSITIVE ®
AT
ATTRIBUTE; added in 8.0.21 (nonreserved)
AUTHENTICATION; added in 8.0.27 (nonreserved)
AUTOEXTEND_SIZE
AUTO_INCREMENT
AVG
AVG_ROW_LENGTH

B

BACKUP
BEFORE ®
BEGIN
BETWEEN ®
BIGINT ®
BINARY ®
BINLOG
BIT
BLOB ®
BLOCK
BOOL
BOOLEAN
BOTH ®
BTREE
BUCKETS; added in 8.0.2 (nonreserved)
BULK; added in 8.0.32 (nonreserved)
BY ®
BYTE

C

CACHE
CALL ®
CASCADE ®
CASCADED
CASE ®
CATALOG_NAME
CHAIN
CHALLENGE_RESPONSE; added in 8.0.27 (nonreserved)
CHANGE ®
CHANGED
CHANNEL
CHAR ®
CHARACTER ®
CHARSET
CHECK ®
CHECKSUM
CIPHER
CLASS_ORIGIN
CLIENT
CLONE; added in 8.0.3 (nonreserved)
CLOSE
COALESCE
CODE
COLLATE ®
COLLATION
COLUMN ®
COLUMNS
COLUMN_FORMAT
COLUMN_NAME
COMMENT
COMMIT
COMMITTED
COMPACT
COMPLETION
COMPONENT
COMPRESSED
COMPRESSION
CONCURRENT
CONDITION ®
CONNECTION
CONSISTENT
CONSTRAINT ®
CONSTRAINT_CATALOG
CONSTRAINT_NAME
CONSTRAINT_SCHEMA
CONTAINS
CONTEXT
CONTINUE ®
CONVERT ®
CPU
CREATE ®
CROSS ®
CUBE ®; 在 8.0.1 中变为保留
CUME_DIST ®; 在 8.0.2 中添加(保留)
CURRENT
CURRENT_DATE ®
CURRENT_TIME ®
CURRENT_TIMESTAMP ®
CURRENT_USER ®
CURSOR ®
CURSOR_NAME

D

DATA
DATABASE ®
DATABASES ®
DATAFILE
DATE
DATETIME
DAY
DAY_HOUR ®
DAY_MICROSECOND ®
DAY_MINUTE ®
DAY_SECOND ®
DEALLOCATE
DEC ®
DECIMAL ®
DECLARE ®
DEFAULT ®
DEFAULT_AUTH
DEFINER
DEFINITION; 在 8.0.4 中添加(非保留)
DELAYED ®
DELAY_KEY_WRITE
DELETE ®
DENSE_RANK ®; 在 8.0.2 中添加(保留)
DESC ®
DESCRIBE ®
DESCRIPTION; 在 8.0.4 中添加(非保留)
DES_KEY_FILE; 在 8.0.3 中移除
DETERMINISTIC ®
DIAGNOSTICS
DIRECTORY
DISABLE
DISCARD
DISK
DISTINCT ®
DISTINCTROW ®
DIV ®
DO
DOUBLE ®
DROP ®
DUAL ®
DUMPFILE
DUPLICATE
DYNAMIC

E

EACH ®
ELSE ®
ELSEIF ®
EMPTY ®; 在 8.0.4 中添加(保留)
ENABLE
ENCLOSED ®
ENCRYPTION
END
ENDS
ENFORCED; 在 8.0.16 中添加(非保留)
ENGINE
ENGINES
ENGINE_ATTRIBUTE; 在 8.0.21 中添加(非保留)
ENUM
ERROR
ERRORS
ESCAPE
ESCAPED ®
EVENT
EVENTS
EVERY
EXCEPT ®
EXCHANGE
EXCLUDE; 在 8.0.2 中添加(非保留)
EXECUTE
EXISTS ®
EXIT ®
EXPANSION
EXPIRE
EXPLAIN ®
EXPORT
EXTENDED
EXTENT_SIZE

F

FACTOR; 在 8.0.27 中添加(非保留)
FAILED_LOGIN_ATTEMPTS; 在 8.0.19 中添加(非保留)
FALSE ®
FAST
FAULTS
FETCH ®
FIELDS
FILE
FILE_BLOCK_SIZE
FILTER
FINISH; 在 8.0.27 中添加(非保留)
FIRST
FIRST_VALUE ®; 在 8.0.2 中添加(保留)
FIXED
FLOAT ®
FLOAT4 ®
FLOAT8 ®
FLUSH
FOLLOWING; 在 8.0.2 中添加(非保留)
FOLLOWS
FOR ®
FORCE ®
FOREIGN ®
FORMAT
FOUND
FROM ®
FULL
FULLTEXT ®
FUNCTION ®; 在 8.0.1 中变为保留

G

GENERAL
GENERATE; 在 8.0.32 中添加(非保留)
GENERATED ®
GEOMCOLLECTION; 在 8.0.11 中添加(非保留)
GEOMETRY
GEOMETRYCOLLECTION
GET ®
GET_FORMAT
GET_MASTER_PUBLIC_KEY; 在 8.0.4 中添加(保留);在 8.0.11 中变为非保留
GET_SOURCE_PUBLIC_KEY; 在 8.0.23 中添加(非保留)
GLOBAL
GRANT ®
GRANTS
GROUP ®
GROUPING ®; 在 8.0.1 中添加(保留)
GROUPS ®; 在 8.0.2 中添加(保留)
GROUP_REPLICATION
GTID_ONLY; 在 8.0.27 中添加(非保留)

H

HANDLER
HASH
HAVING ®
HELP
HIGH_PRIORITY ®
HISTOGRAM; 在 8.0.2 中添加(非保留)
HISTORY; 在 8.0.3 中添加(非保留)
HOST
HOSTS
HOUR
HOUR_MICROSECOND ®
HOUR_MINUTE ®
HOUR_SECOND ®

I

IDENTIFIED
IF ®
IGNORE ®
IGNORE_SERVER_IDS
IMPORT
IN ®
INACTIVE; 在 8.0.14 中添加(非保留)
INDEX ®
INDEXES
INFILE ®
INITIAL; 在 8.0.27 中添加(非保留)
INITIAL_SIZE
INITIATE; 在 8.0.27 中添加(非保留)
INNER ®
INOUT ®
INSENSITIVE ®
INSERT ®
INSERT_METHOD
INSTALL
INSTANCE
INT ®
INT1 ®
INT2 ®
INT3 ®
INT4 ®
INT8 ®
INTEGER ®
INTERSECT ®; added in 8.0.31 (reserved)
INTERVAL ®
INTO ®
INVISIBLE
INVOKER
IO
IO_AFTER_GTIDS ®
IO_BEFORE_GTIDS ®
IO_THREAD
IPC
IS ®
ISOLATION
ISSUER
ITERATE ®

J

JOIN ®
JSON
JSON_TABLE ®; added in 8.0.4 (reserved)
JSON_VALUE; added in 8.0.21 (nonreserved)

K

KEY ®
KEYRING; added in 8.0.24 (nonreserved)
KEYS ®
KEY_BLOCK_SIZE
KILL ®

L

LAG ®; added in 8.0.2 (reserved)
LANGUAGE
LAST
LAST_VALUE ®; added in 8.0.2 (reserved)
LATERAL ®; added in 8.0.14 (reserved)
LEAD ®; added in 8.0.2 (reserved)
LEADING ®
LEAVE ®
LEAVES
LEFT ®
LESS
LEVEL
LIKE ®
LIMIT ®
LINEAR ®
LINES ®
LINESTRING
LIST
LOAD ®
LOCAL
LOCALTIME ®
LOCALTIMESTAMP ®
LOCK ®
LOCKED; added in 8.0.1 (nonreserved)
LOCKS
LOGFILE
LOGS
LONG ®
LONGBLOB ®
LONGTEXT ®
LOOP ®
LOW_PRIORITY ®

M

MASTER
MASTER_AUTO_POSITION
MASTER_BIND ®
MASTER_COMPRESSION_ALGORITHMS; added in 8.0.18 (nonreserved)
MASTER_CONNECT_RETRY
MASTER_DELAY
MASTER_HEARTBEAT_PERIOD
MASTER_HOST
MASTER_LOG_FILE
MASTER_LOG_POS
MASTER_PASSWORD
MASTER_PORT
MASTER_PUBLIC_KEY_PATH; added in 8.0.4 (nonreserved)
MASTER_RETRY_COUNT
MASTER_SERVER_ID; removed in 8.0.23
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 ®
MASTER_TLS_CIPHERSUITES; added in 8.0.19 (nonreserved)
MASTER_TLS_VERSION
MASTER_USER
MASTER_ZSTD_COMPRESSION_LEVEL; added in 8.0.18 (nonreserved)
MATCH ®
MAXVALUE ®
MAX_CONNECTIONS_PER_HOUR
MAX_QUERIES_PER_HOUR
MAX_ROWS
MAX_SIZE
MAX_UPDATES_PER_HOUR
MAX_USER_CONNECTIONS
MEDIUM
MEDIUMBLOB ®
MEDIUMINT ®
MEDIUMTEXT ®
MEMBER; added in 8.0.17 (reserved); became nonreserved in 8.0.19
MEMORY
MERGE
MESSAGE_TEXT
MICROSECOND
MIDDLEINT ®
MIGRATE
MINUTE
MINUTE_MICROSECOND ®
MINUTE_SECOND ®
MIN_ROWS
MOD ®
MODE
MODIFIES ®
MODIFY
MONTH
MULTILINESTRING
MULTIPOINT
MULTIPOLYGON
MUTEX
MYSQL_ERRNO

N

NAME
NAMES
NATIONAL
NATURAL ®
NCHAR
NDB
NDBCLUSTER
NESTED; added in 8.0.4 (nonreserved)
NETWORK_NAMESPACE; added in 8.0.16 (nonreserved)
NEVER
NEW
NEXT
NO
NODEGROUP
NONE
NOT ®
NOWAIT; added in 8.0.1 (nonreserved)
NO_WAIT
NO_WRITE_TO_BINLOG ®
NTH_VALUE ®; added in 8.0.2 (reserved)
NTILE ®; added in 8.0.2 (reserved)
NULL ®
NULLS; added in 8.0.2 (nonreserved)
NUMBER
NUMERIC ®
NVARCHAR

O

OF ®; added in 8.0.1 (reserved)
OFF; added in 8.0.20 (nonreserved)
OFFSET
OJ; added in 8.0.16 (nonreserved)
OLD; added in 8.0.14 (nonreserved)
ON ®
ONE
ONLY
OPEN
OPTIMIZE ®
OPTIMIZER_COSTS ®
OPTION ®
OPTIONAL; added in 8.0.13 (nonreserved)
OPTIONALLY ®
OPTIONS
OR ®
ORDER ®
ORDINALITY; added in 8.0.4 (nonreserved)
ORGANIZATION; 在 8.0.4 版本中添加(非保留)
OTHERS; 在 8.0.2 版本中添加(非保留)
OUT ®
OUTER ®
OUTFILE ®
OVER ®; 在 8.0.2 版本中添加(保留)
OWNER

P

PACK_KEYS
PAGE
PARSER
PARTIAL
PARTITION ®
PARTITIONING
PARTITIONS
PASSWORD
PASSWORD_LOCK_TIME; 在 8.0.19 版本中添加(非保留)
PATH; 在 8.0.4 版本中添加(非保留)
PERCENT_RANK ®; 在 8.0.2 版本中添加(保留)
PERSIST; 在 8.0.16 版本中变为非保留
PERSIST_ONLY; 在 8.0.2 版本中添加(保留);在 8.0.16 版本中变为非保留
PHASE
PLUGIN
PLUGINS
PLUGIN_DIR
POINT
POLYGON
PORT
PRECEDES
PRECEDING; 在 8.0.2 版本中添加(非保留)
PRECISION ®
PREPARE
PRESERVE
PREV
PRIMARY ®
PRIVILEGES
PRIVILEGE_CHECKS_USER; 在 8.0.18 版本中添加(非保留)
PROCEDURE ®
PROCESS; 在 8.0.11 版本中添加(非保留)
PROCESSLIST
PROFILE
PROFILES
PROXY
PURGE ®

Q

QUARTER
QUERY
QUICK

R

RANDOM; 在 8.0.18 版本中添加(非保留)
RANGE ®
RANK ®; 在 8.0.2 版本中添加(保留)
READ ®
READS ®
READ_ONLY
READ_WRITE ®
REAL ®
REBUILD
RECOVER
RECURSIVE ®; 在 8.0.1 版本中添加(保留)
REDOFILE; 在 8.0.3 版本中移除
REDO_BUFFER_SIZE
REDUNDANT
REFERENCE; 在 8.0.4 版本中添加(非保留)
REFERENCES ®
REGEXP ®
REGISTRATION; 在 8.0.27 版本中添加(非保留)
RELAY
RELAYLOG
RELAY_LOG_FILE
RELAY_LOG_POS
RELAY_THREAD
RELEASE ®
RELOAD
REMOTE; 在 8.0.3 版本中添加(非保留);在 8.0.14 版本中移除
REMOVE
RENAME ®
REORGANIZE
REPAIR
REPEAT ®
REPEATABLE
REPLACE ®
REPLICA; 在 8.0.22 版本中添加(非保留)
REPLICAS; 在 8.0.22 版本中添加(非保留)
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 ®
REQUIRE_ROW_FORMAT; 在 8.0.19 版本中添加(非保留)
RESET
RESIGNAL ®
RESOURCE; 在 8.0.3 版本中添加(非保留)
RESPECT; 在 8.0.2 版本中添加(非保留)
RESTART; 在 8.0.4 版本中添加(非保留)
RESTORE
RESTRICT ®
RESUME
RETAIN; 在 8.0.14 版本中添加(非保留)
RETURN ®
RETURNED_SQLSTATE
RETURNING; 在 8.0.21 版本中添加(非保留)
RETURNS
REUSE; 在 8.0.3 版本中添加(非保留)
REVERSE
REVOKE ®
RIGHT ®
RLIKE ®
ROLE; 在 8.0.1 版本中变为非保留
ROLLBACK
ROLLUP
ROTATE
ROUTINE
ROW ®; 在 8.0.2 版本中变为保留
ROWS ®; 在 8.0.2 版本中变为保留
ROW_COUNT
ROW_FORMAT
ROW_NUMBER ®; 在 8.0.2 版本中添加(保留)
RTREE

S

SAVEPOINT
SCHEDULE
SCHEMA ®
SCHEMAS ®
SCHEMA_NAME
SECOND
SECONDARY; 在 8.0.16 版本中添加(非保留)
SECONDARY_ENGINE; 在 8.0.13 版本中添加(非保留)
SECONDARY_ENGINE_ATTRIBUTE; 在 8.0.21 版本中添加(非保留)
SECONDARY_LOAD; 在 8.0.13 版本中添加(非保留)
SECONDARY_UNLOAD; 在 8.0.13 版本中添加(非保留)
SECOND_MICROSECOND ®
SECURITY
SELECT ®
SENSITIVE ®
SEPARATOR ®
SERIAL
SERIALIZABLE
SERVER
SESSION
SET ®
SHARE
SHOW ®
SHUTDOWN
SIGNAL ®
SIGNED
SIMPLE
SKIP; 在 8.0.1 版本中添加(非保留)
SLAVE
SLOW
SMALLINT(R)
SNAPSHOT
SOCKET
SOME
SONAME
SOUNDS
SOURCE
SOURCE_AUTO_POSITION; 在 8.0.23 版本中添加(非保留)
SOURCE_BIND; 在 8.0.23 版本中添加(��保留)
SOURCE_COMPRESSION_ALGORITHMS; 在 8.0.23 版本中添加(非保留)
SOURCE_CONNECT_RETRY; 在 8.0.23 版本中添加(非保留)
SOURCE_DELAY; 在 8.0.23 版本中添加(非保留)
SOURCE_HEARTBEAT_PERIOD; 在 8.0.23 版本中添加(非保留)
SOURCE_HOST; 在 8.0.23 版本中添加(非保留)
SOURCE_LOG_FILE; 在 8.0.23 版本中添加(非保留)
SOURCE_LOG_POS; 在 8.0.23 版本中添加(非保留)
SOURCE_PASSWORD; 在 8.0.23 版本中添加(非保留)
SOURCE_PORT; 在 8.0.23 版本中添加(非保留)
SOURCE_PUBLIC_KEY_PATH; 在 8.0.23 版本中添加(非保留)
SOURCE_RETRY_COUNT; 在 8.0.23 版本中添加(非保留)
SOURCE_SSL; 在 8.0.23 版本中添加(非保留)
SOURCE_SSL_CA; 在 8.0.23 版本中添加(非保留)
SOURCE_SSL_CAPATH; 在 8.0.23 版本中添加(非保留)
SOURCE_SSL_CERT; 在 8.0.23 版本中添加(非保留)
SOURCE_SSL_CIPHER; 在 8.0.23 版本中添加(非保留)
SOURCE_SSL_CRL; 在 8.0.23 版本中添加(非保留)
SOURCE_SSL_CRLPATH; 在 8.0.23 版本中添加(非保留)
SOURCE_SSL_KEY; 在 8.0.23 版本中添加(非保留)
SOURCE_SSL_VERIFY_SERVER_CERT; 在 8.0.23 版本中添加(非保留)
SOURCE_TLS_CIPHERSUITES; 在 8.0.23 版本中添加(非保留)
SOURCE_TLS_VERSION; 在 8.0.23 版本中添加(非保留)
SOURCE_USER; 在 8.0.23 版本中添加(非保留)
SOURCE_ZSTD_COMPRESSION_LEVEL; 在 8.0.23 版本中添加(非保留)
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)
STREAM; 在 8.0.20 版本中添加(非保留)
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)
TLS; 在 8.0.21 版本中添加(非保留)
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)
UNREGISTER; 在 8.0.27 版本中添加(非保留)
UNSIGNED(R)
UNTIL
UPDATE(R)
UPGRADE
URL; added in 8.0.32 (nonreserved)
USAGE ®
USE ®
USER
USER_RESOURCES
USE_FRM
USING ®
UTC_DATE ®
UTC_TIME ®
UTC_TIMESTAMP ®

V

VALIDATION
VALUE
VALUES ®
VARBINARY ®
VARCHAR ®
VARCHARACTER ®
VARIABLES
VARYING ®
VCPU; added in 8.0.3 (nonreserved)
VIEW
VIRTUAL ®
VISIBLE

W

WAIT
WARNINGS
WEEK
WEIGHT_STRING
WHEN ®
WHERE ®
WHILE ®
WINDOW ®; added in 8.0.2 (reserved)
WITH ®
WITHOUT
WORK
WRAPPER
WRITE ®

X

X509
XA
XID
XML
XOR ®

Y

YEAR
YEAR_MONTH ®

Z

ZEROFILL ®
ZONE; added in 8.0.22 (nonreserved)

MySQL 8.0 新关键字和保留字

以下列表显示了与 MySQL 5.7 相比,在 MySQL 8.0 中新增的关键字和保留字。保留关键字标记为®。

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | R | S | T | U | V | W | Z

A

ACTIVE
ADMIN
ARRAY
ATTRIBUTE
AUTHENTICATION

B

BUCKETS
BULK

C

CHALLENGE_RESPONSE
CLONE
COMPONENT
CUME_DIST ®

D

DEFINITION
DENSE_RANK ®
DESCRIPTION

E

EMPTY ®
ENFORCED
ENGINE_ATTRIBUTE
EXCEPT ®
EXCLUDE

F

FACTOR
FAILED_LOGIN_ATTEMPTS
FINISH
FIRST_VALUE ®
FOLLOWING

G

GENERATE
GEOMCOLLECTION
GET_MASTER_PUBLIC_KEY
GET_SOURCE_PUBLIC_KEY
GROUPING ®
GROUPS ®
GTID_ONLY

H

HISTOGRAM
HISTORY

I

INACTIVE
INITIAL
INITIATE
INTERSECT ®
INVISIBLE

J

JSON_TABLE ®
JSON_VALUE

K

KEYRING
L

LAG ®
LAST_VALUE ®
LATERAL ®
LEAD ®
LOCKED

M

MASTER_COMPRESSION_ALGORITHMS
MASTER_PUBLIC_KEY_PATH
MASTER_TLS_CIPHERSUITES
MASTER_ZSTD_COMPRESSION_LEVEL
MEMBER

N

NESTED
NETWORK_NAMESPACE
NOWAIT
NTH_VALUE ®
NTILE ®
NULLS

O

OF ®
OFF
OJ
OLD
OPTIONAL
ORDINALITY
ORGANIZATION
OTHERS
OVER ®

P

PASSWORD_LOCK_TIME
PATH
PERCENT_RANK ®
PERSIST
PERSIST_ONLY
PRECEDING
PRIVILEGE_CHECKS_USER
PROCESS

R

RANDOM
RANK ®
RECURSIVE ®
REFERENCE
REGISTRATION
REPLICA
REPLICAS
REQUIRE_ROW_FORMAT
RESOURCE
RESPECT
RESTART
RETAIN
RETURNING
REUSE
ROLE
ROW_NUMBER ®

S

SECONDARY
SECONDARY_ENGINE
SECONDARY_ENGINE_ATTRIBUTE
SECONDARY_LOAD
SECONDARY_UNLOAD
SKIP
SOURCE_AUTO_POSITION
SOURCE_BIND
SOURCE_COMPRESSION_ALGORITHMS
SOURCE_CONNECT_RETRY
SOURCE_DELAY
SOURCE_HEARTBEAT_PERIOD
SOURCE_HOST
SOURCE_LOG_FILE
SOURCE_LOG_POS
SOURCE_PASSWORD
SOURCE_PORT
SOURCE_PUBLIC_KEY_PATH
SOURCE_RETRY_COUNT
SOURCE_SSL
SOURCE_SSL_CA
SOURCE_SSL_CAPATH
SOURCE_SSL_CERT
SOURCE_SSL_CIPHER
SOURCE_SSL_CRL
SOURCE_SSL_CRLPATH
SOURCE_SSL_KEY
SOURCE_SSL_VERIFY_SERVER_CERT
SOURCE_TLS_CIPHERSUITES
SOURCE_TLS_VERSION
SOURCE_USER
SOURCE_ZSTD_COMPRESSION_LEVEL
SRID
STREAM
SYSTEM ®

T

THREAD_PRIORITY
TIES
TLS

U

UNBOUNDED
UNREGISTER
URL

V

VCPU
VISIBLE

W

WINDOW ®
Z

ZONE

MySQL 8.0 Removed Keywords and Reserved Words

以下列表显示了与 MySQL 5.7 相比,在 MySQL 8.0 中被移除的关键字和保留字。保留关键字标记为®。

ANALYSE
DES_KEY_FILE
MASTER_SERVER_ID
PARSE_GCOL_EXPR
REDOFILE
SQL_CACHE

#以上关于MySQL8 中文参考(四十一)的相关内容来源网络仅供参考,相关信息请以官方公告为准!

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92500.html

(0)
CSDN的头像CSDN
上一篇 2024年6月27日
下一篇 2024年6月27日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注