MySQL8 中文参考(二)(3)https://developer.aliyun.com/article/1566099
1.5 如何报告错误或问题
在报告关于问题的错误之前,请尝试验证它是否是一个错误,并且尚未被报告过:
- 首先在
dev.mysql.com/doc/
上搜索 MySQL 在线手册。我们会经常更新手册,以解决新发现的问题。此外,手册附带的发布说明可能特别有用,因为很可能新版本包含了解决你问题的方法。发布说明可以在手册给出的位置找到。 - 如果对 SQL 语句出现解析错误,请仔细检查语法。如果你找不到任何问题,那么极有可能是你当前的 MySQL 服务器版本不支持你正在使用的语法。如果你正在使用当前版本且手册没有涵盖你正在使用的语法,那么 MySQL 服务器不支持你的语句。
如果手册涵盖了你正在使用的语法,但你使用的是旧版本的 MySQL 服务器,你应该查看 MySQL 更改历史,看看语法是何时实现的。在这种情况下,你可以选择升级到较新版本的 MySQL 服务器。 - 对于一些常见问题的解决方案,请参见 Section B.3, “Problems and Common Errors”。
- 在
bugs.mysql.com/
的错误数据库中搜索,看看该错误是否已被报告并修复。 - 你也可以使用
www.mysql.com/search/
来搜索位于 MySQL 网站上的所有网页(包括手册)。
如果在手册、错误数据库或邮件列表存档中找不到答案,请咨询你当地的 MySQL 专家。如果你仍然找不到问题的答案,请使用以下报告错误的准则。
报告错误的常规方式是访问bugs.mysql.com/
,这是我们错误数据库的地址。这个数据库是公开的,任何人都可以浏览和搜索。如果你登录系统,你可以输入新的报告。
在bugs.mysql.com/
的错误数据库中,对于给定版本已经修正的错误会在发布说明中有所记录。
如果你发现 MySQL 服务器中的安全漏洞,请立即通过电子邮件发送消息至告知我们。例外:支持客户应将所有问题(包括安全漏洞)报告给 Oracle 支持团队,网址为
support.oracle.com/
。
要与其他用户讨论问题,你可以使用MySQL 社区 Slack。
撰写一个好的错误报告需要耐心,但第一次就做对可以为我们和您节省时间。一个好的错误报告,包含了错误的完整测试用例,使我们很有可能在下一个版本中修复错误。本节帮助您正确撰写报告,以便您不会浪费时间做一些可能对我们没有太大帮助或根本没有帮助的事情。请仔细阅读本节,并确保您的报告中包含了这里描述的所有信息。
最好在发布之前使用最新的生产或开发版本的 MySQL 服务器测试问题。任何人都应该能够通过在您的测试用例上使用mysql test < script_file
或运行您在错误报告中包含的 shell 或 Perl 脚本来重现错误。我们能够重复的任何错误都有很高的机会在下一个 MySQL 版本中修复。
当错误报告中包含问题的良好描述时,这是最有帮助的。也就是说,给出导致问题的所有操作的良好示例,并详细描述问题本身。最好的报告是那些包含了展示如何重现错误或问题的完整示例的报告。请参阅第 7.9 节,“调试 MySQL”。
请记住,我们可以回应包含太多信息的报告,但无法回应包含太少信息的报告。人们经常省略事实,因为他们认为他们知道问题的原因,并假设一些细节并不重要。一个好的原则是,如果您对陈述某事感到犹豫,请陈述。在您的报告中写几行比等待更长时间以便我们要求您提供初始报告中缺少的信息更快且不麻烦。
在错误报告中最常见的错误是(a)没有包括您使用的 MySQL 发行版的版本号,以及(b)没有完全描述 MySQL 服务器安装在哪个平台上(包括平台类型和版本号)。这些是非常相关的信息,在 100 次中有 99 次,没有这些信息的错误报告是没有用的。我们经常收到类似的问题,“为什么这对我不起作用?”然后我们发现所请求的功能没有在那个 MySQL 版本中实现,或者报告中描述的错误已经在更新的 MySQL 版本中修复。错误通常是与平台相关的。在这种情况下,如果不知道操作系统和平台版本号,我们几乎不可能修复任何问题。
如果你从源代码编译 MySQL,请记得提供与问题相关的编译器信息。通常人们会在编译器中发现错误,并认为问题与 MySQL 相关。大多数编译器一直在不断发展,版本逐渐变得更好。为了确定你的问题是否取决于编译器,我们需要知道你使用的编译器是什么。请注意,每个编译问题都应视为错误并相应报告。
如果程序产生了错误消息,将消息包含在报告中非常重要。如果我们尝试从存档中搜索某些内容,最好是错误消息与程序产生的消息完全匹配。 (甚至要注意大小写。)最好将整个错误消息复制粘贴到报告中。永远不要试图从记忆中重现消息。
如果你在使用 Connector/ODBC(MyODBC)时遇到问题,请尝试生成一个跟踪文件并将其与报告一起发送。请参阅 如何报告 Connector/ODBC 问题或错误。
如果你的报告包含使用 mysql 命令行工具运行的测试用例的长查询输出行,你可以通过使用 --vertical
选项或 \G
语句终止符使输出更易读。本节后面的 EXPLAIN SELECT
示例演示了 \G
的使用。
请在你的报告中包含以下信息:
- 你正在使用的 MySQL 发行版的版本号(例如,MySQL 5.7.10)。你可以通过执行 mysqladmin version 来查看你正在运行的版本。mysqladmin 程序可以在你的 MySQL 安装目录下的
bin
目录中找到。 - 你遇到问题的计算机的制造商和型号。
- 操作系统的名称和版本。如果你使用 Windows,通常可以通过双击“我的电脑”图标并下拉“帮助/关于 Windows”菜单来获取名称和版本号。对于大多数类 Unix 操作系统,你可以通过执行命令
uname -a
来获取这些信息。 - 有时内存(实际和虚拟)的数量是相关的。如果有疑问,请包含这些值。
docs/INFO_BIN
文件的内容来自于你的 MySQL 安装。这个文件包含了关于 MySQL 配置和编译的信息。- 如果你使用 MySQL 软件的源代码发行版,请包含你使用的编译器的名称和版本号。如果你有一个二进制发行版,请包含发行版名称。
- 如果问题发生在编译过程中,请包含确切的错误消息,以及出错代码周围的几行上下文,这些代码位于发生错误的文件中。
- 如果mysqld崩溃,您还应报告导致mysqld意外退出的语句。通常可以通过启用查询日志运行mysqld,然后在mysqld退出后查看日志来获取此信息。请参阅第 7.9 节“调试 MySQL”。
- 如果数据库表与问题有关,请在错误报告中包含
SHOW CREATE TABLE *
db_name*.*
tbl_name*
语句的输出。这是获取数据库中任何表定义的非常简单的方法。这些信息有助于我们创建与您经历的情况相匹配的情况。 - 发生问题时的 SQL 模式可能很重要,请报告
sql_mode
系统变量的值。对于存储过程、存储函数和触发器对象,相关的sql_mode
值是创建对象时有效的值。对于存储过程或函数,SHOW CREATE PROCEDURE
或SHOW CREATE FUNCTION
语句显示相关的 SQL 模式,或者您可以查询INFORMATION_SCHEMA
获取信息:
SELECT ROUTINE_SCHEMA, ROUTINE_NAME, SQL_MODE FROM INFORMATION_SCHEMA.ROUTINES;
- 对于触发器,您可以使用以下语句:
SELECT EVENT_OBJECT_SCHEMA, EVENT_OBJECT_TABLE, TRIGGER_NAME, SQL_MODE FROM INFORMATION_SCHEMA.TRIGGERS;
- 对于与性能相关的错误或
SELECT
语句的问题,您应该始终包含EXPLAIN SELECT ...
的输出,以及SELECT
语句产生的行数。您还应该包含每个涉及的表的SHOW CREATE TABLE *
tbl_name*
的输出。您提供的关于您情况的信息越多,别人就越有可能帮助您。
以下是一个非常好的错误报告示例。这些语句是使用mysql命令行工具运行的。请注意对于本来会提供非常长的输出行且难以阅读的语句,使用\G
语句终止符。
mysql> SHOW VARIABLES; mysql> SHOW COLUMNS FROM ...\G *<output from SHOW COLUMNS>* mysql> EXPLAIN SELECT ...\G *<output from EXPLAIN>* mysql> FLUSH STATUS; mysql> SELECT ...; *<A short version of the output from SELECT, including the time taken to run the query>* mysql> SHOW STATUS; *<output from SHOW STATUS>*
- 如果在运行mysqld时出现错误或问题,请尝试提供一个可重现异常的输入脚本。此脚本应包括任何必要的源文件。脚本能够更紧密地重现您的情况,效果就会更好。如果您能制作一个可重现的测试用例,应将其上传以附加到错误报告。
如果您无法提供脚本,至少应在报告中包含mysqladmin variables extended-status processlist的输出,以提供有关系统性能的一些信息。 - 如果您无法仅使用少量行生成测试用例,或者测试表太大而无法包含在错误报告中(超过 10 行),则应使用mysqldump转储您的表,并创建一个描述问题的
README
文件。使用tar和gzip或zip创建您文件的压缩存档。在bugs.mysql.com/
为我们的错误数据库启动错误报告后,在错误报告中单击“文件”选项卡以获取有关将存档上传到错误数据库的说明。 - 如果您认为 MySQL 服务器从一个语句中产生了奇怪的结果,请不仅包括结果,还包括您认为结果应该是什么以及解释描述您观点基础的说明。
- 当您提供问题示例时,最好使用实际情况中存在的表名、变量名等,而不是想出新名称。问题可能与表名或变量名有关。这种情况可能很少,但安全起见总是好过后悔。毕竟,您提供一个使用实际情况的示例应该更容易,对我们来说也更好。如果您有不希望在错误报告中对其他人可见的数据,可以按照之前描述的方法使用“文件”选项卡上传它。如果信息真的是绝密的,甚至您也不想向我们展示,那就使用其他名称提供一个示例,但请将其视为最后选择。
- 尽可能包含给相关程序的所有选项。例如,指示您启动mysqld服务器时使用的选项,以及运行任何 MySQL 客户端程序时使用的选项。对于诸如mysqld和mysql以及configure脚本等程序的选项通常是解决问题的关键,并且非常相关。包含它们从来不是一个坏主意。如果您的问题涉及使用 Perl 或 PHP 等语言编写的程序,请包括语言处理器的版本号,以及程序使用的任何模块的版本。例如,如果您有一个使用
DBI
和DBD::mysql
模块的 Perl 脚本,请包括 Perl、DBI
和DBD::mysql
的版本号。 - 如果您的问题与权限系统有关,请包含mysqladmin reload的输出,以及尝试连接时收到的所有错误消息。在测试权限时,您应该执行mysqladmin reload version并尝试使用导致问题的程序进行连接。
- 如果您有一个用于修复错误的补丁,请包含它。但不要假设补丁是我们需要的全部,或者如果您没有提供一些必要信息,比如显示您的补丁修复的错误的测试用例。我们可能会发现您的补丁存在问题,或者我们可能根本无法理解它。如果是这样,我们无法使用它。
如果我们无法验证补丁的确切目的,我们将不使用它。测试用例在这里对我们有帮助。展示补丁处理可能发生的所有情况。如果我们发现边界情况(即使是罕见的情况)补丁无法工作,那么它可能是无用的。 - 猜测错误是什么,为什么会发生,或者它依赖于什么通常是错误的。即使 MySQL 团队也不能在使用调试器确定错误的真正原因之前猜测这些事情。
- 在您的错误报告中指出您已经检查了参考手册和邮件存档,以便其他人知道您已经尝试自己解决问题。
- 如果您的数据看起来损坏或者在访问特定表格时出现错误,请首先使用
CHECK TABLE
检查您的表格。如果该语句报告任何错误:
InnoDB
崩溃恢复机制在服务器被杀死后重新启动时处理清理工作,因此在典型操作中不需要“修复”表格。如果遇到InnoDB
表格错误,请重新启动服务器并查看问题是否仍然存在,或者错误是否仅影响内存中的缓存数据。如果磁盘上的数据损坏,请考虑启用innodb_force_recovery
选项重新启动,以便您可以转储受影响的表格。- 对于非事务性表格,请尝试使用
REPAIR TABLE
或myisamchk进行修复。参见第七章,MySQL 服务器管理。
- 如果您正在运行 Windows,请使用
SHOW VARIABLES LIKE 'lower_case_table_names'
语句验证lower_case_table_names
的值。此变量影响服务器处理数据库和表格名称的大小写。对于给定值的影响应如第 11.2.3 节,“标识符大小写敏感性”中描述的那样。 - 如果你经常遇到损坏的表格,你应该尝试找出这种情况发生的时间和原因。在这种情况下,MySQL 数据目录中的错误日志可能包含一些关于发生了什么的信息(这是带有
.err
后缀的文件)。请在您的错误报告中包含来自此文件的任何相关信息。通常情况下,如果没有被中断更新的情况,mysqld 永远不应该损坏表格。如果你能找到mysqld死亡的原因,那么我们就能更容易地为你提供解决问题的方法。参见 Section B.3.1, “How to Determine What Is Causing a Problem”。 - 如果可能的话,请下载并安装最新版本的 MySQL 服务器,并检查是否解决了你的问题。所有版本的 MySQL 软件都经过了彻底测试,应该可以正常工作。我们相信尽可能使一切向后兼容,你应该能够轻松切换 MySQL 版本。参见 Section 2.1.2, “Which MySQL Version and Distribution to Install”。
1.6 MySQL 标准兼容性
1.6.1 MySQL 对标准 SQL 的扩展
1.6.2 MySQL 与标准 SQL 的差异
1.6.3 MySQL 如何处理约束
本节描述了 MySQL 与 ANSI/ISO SQL 标准的关系。MySQL Server 对 SQL 标准有许多扩展,在这里您可以找到它们是什么以及如何使���它们。您还可以找到有关 MySQL Server 缺失功能的信息,以及如何解决其中一些差异。
SQL 标准自 1986 年以来一直在不断发展,存在多个版本。在本手册中,“SQL-92” 指的是 1992 年发布的标准。“SQL:1999”、“SQL:2003”、“SQL:2008” 和 “SQL:2011” 分别指的是相应年份发布的标准版本,最后一个是最新版本。我们使用短语 “SQL 标准” 或 “标准 SQL” 来表示任何时候 SQL 标准的当前版本。
我们的产品的主要目标之一是继续努力遵守 SQL 标准,但不会牺牲速度或可靠性。如果这大大提高了 MySQL Server 对我们大部分用户群体的可用性,我们不会害怕添加 SQL 扩展或非 SQL 功能的支持。HANDLER
接口就是这种策略的一个例子。请参阅 第 15.2.5 节,“HANDLER 语句”。
我们继续支持事务性和非事务性数据库,以满足关键任务的 24/7 使用和大量 Web 或日志使用。
MySQL Server 最初设计用于在小型计算机系统上处理中等大小的数据库(10-100 百万行,或每个表约 100MB)。如今,MySQL Server 处理 TB 级别大小的数据库。
我们不针对实时支持,尽管 MySQL 复制功能提供了重要的功能。
MySQL 支持 ODBC 0 到 3.51 级别。
MySQL 支持使用 NDBCLUSTER
存储引擎进行高可用性数据库集群。请参阅 第二十五章,“MySQL NDB Cluster 8.0”。
我们实现了支持大部分 W3C XPath 标准的 XML 功能。请参阅 第 14.11 节,“XML 函数”。
MySQL 支持由 RFC 7159 定义的本机 JSON 数据类型,并基于 ECMAScript 标准(ECMA-262)。请参阅 第 13.5 节,“JSON 数据类型”。MySQL 还实现了 SQL:2016 标准的一个预发布草案中指定的 SQL/JSON 函数子集;更多信息请参阅 第 14.17 节,“JSON 函数”。
选择 SQL 模式
MySQL 服务器可以在不同的 SQL 模式下运行,并且可以根据 sql_mode
系统变量的值为不同的客户端应用这些模式。数据库管理员可以将全局 SQL 模式设置为符合站点服务器操作要求的模式,每个应用程序可以将其会话 SQL 模式设置为其自身的要求。
模式影响 MySQL 支持的 SQL 语法和执行的数据验证检查。这使得在不同环境中使用 MySQL 以及与其他数据库服务器一起使用 MySQL 更容易。
有关设置 SQL 模式的更多信息,请参阅 Section 7.1.11, “Server SQL Modes”。
在 ANSI 模式下运行 MySQL
要在 ANSI 模式下运行 MySQL 服务器,请使用 --ansi
选项启动 mysqld。在 ANSI 模式下运行服务器与以下选项启动它相同:
--transaction-isolation=SERIALIZABLE --sql-mode=ANSI
要在运行时实现相同的效果,请执行以下两个语句:
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET GLOBAL sql_mode = 'ANSI';
您可以看到将 sql_mode
系统变量设置为 'ANSI'
会启用所有与 ANSI 模式相关的 SQL 模式选项,如下所示:
mysql> SET GLOBAL sql_mode='ANSI'; mysql> SELECT @@GLOBAL.sql_mode; -> 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI'
使用 --ansi
在 ANSI 模式下运行服务器与将 SQL 模式设置为 'ANSI'
不完全相同,因为 --ansi
选项还设置了事务隔离级别。
请参阅 Section 7.1.7, “Server Command Options”。
1.6.1 MySQL 对标准 SQL 的扩展
MySQL 服务器支持一些其他 SQL DBMS 中不太可能找到的扩展。请注意,如果您使用它们,您的代码很可能无法在其他 SQL 服务器上移植。在某些情况下,您可以编写包含 MySQL 扩展的代码,但仍然是可移植的,方法是使用以下形式的注释:
/*! *MySQL-specific code* */
在这种情况下,MySQL 服务器会解析并执行注释中的代码,就像执行任何其他 SQL 语句一样,但其他 SQL 服务器应该忽略这些扩展。例如,MySQL 服务器会识别以下语句中的STRAIGHT_JOIN
关键字,但其他服务器不应该:
SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
如果在!
字符后添加版本号,则仅当 MySQL 版本大于或等于指定版本号时才执行注释中的语法。以下注释中的KEY_BLOCK_SIZE
子句仅在 MySQL 5.1.10 或更高版本的服务器上执行:
CREATE TABLE t1(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024 */;
以下描述列出了按类别组织的 MySQL 扩展。
- 数据在磁盘上的组织
MySQL 服务器将每个数据库映射到 MySQL 数据目录下的一个目录,并将数据库中的表映射到数据库目录中的文件名。因此,在具有区分大小写文件名的操作系统上(例如大多数 Unix 系统),MySQL 服务器中的数据库和表名称是区分大小写的。请参阅 Section 11.2.3, “Identifier Case Sensitivity”。 - 通用语言语法
- 默认情况下,字符串可以用
"
或'
括起来。如果启用了ANSI_QUOTES
SQL 模式,则字符串只能用'
括起来,服务器会将用"
括起来的字符串解释为标识符。 \
是字符串中的转义字符。- 在 SQL 语句中,您可以使用*
db_name.tbl_name
*语法访问不同数据库中的表。一些 SQL 服务器提供相同的功能,但称其为User space
。MySQL 服务器不支持像这样使用表空间的语句:CREATE TABLE ralph.my_table ... IN my_tablespace
。
- SQL 语句语法
ANALYZE TABLE
、CHECK TABLE
、OPTIMIZE TABLE
和REPAIR TABLE
语句。CREATE DATABASE
、DROP DATABASE
和ALTER DATABASE
语句。参见第 15.1.12 节,“CREATE DATABASE Statement”,第 15.1.24 节,“DROP DATABASE Statement”和第 15.1.2 节,“ALTER DATABASE Statement”。DO
语句。EXPLAIN SELECT
以获取查询优化器如何处理表格的描述。FLUSH
和RESET
语句。SET
语句。参见第 15.7.6.1 节,“SET Syntax for Variable Assignment”。SHOW
语句。参见第 15.7.7 节,“SHOW Statements”。许多特定于 MySQL 的SHOW
语句产生的信息可以通过使用SELECT
查询INFORMATION_SCHEMA
来更标准地获取。参见第二十八章,“INFORMATION_SCHEMA Tables”。- 使用
LOAD DATA
语句。在许多情况下,此语法与 Oracle 的LOAD DATA
兼容。参见第 15.2.9 节,“LOAD DATA Statement”。 - 使用
RENAME TABLE
语句。参见第 15.1.36 节,“RENAME TABLE Statement”。 - 使用
REPLACE
代替DELETE
加INSERT
。参见第 15.2.12 节,“REPLACE Statement”。 - 在
ALTER TABLE
语句中使用CHANGE *
col_name*
,DROP *
col_name*
,或DROP INDEX
,IGNORE
或RENAME
。在ALTER TABLE
语句中使用多个ADD
,ALTER
,DROP
或CHANGE
子句。参见第 15.1.9 节,“ALTER TABLE Statement”。 - 在
CREATE TABLE
语句中使用索引名称、列前缀上的索引,以及使用INDEX
或KEY
。参见 第 15.1.20 节,“CREATE TABLE Statement”。 - 在
CREATE TABLE
中使用TEMPORARY
或IF NOT EXISTS
。 - 在
DROP TABLE
和DROP DATABASE
中使用IF EXISTS
。 - 使用单个
DROP TABLE
语句删除多个表的能力。 UPDATE
和DELETE
语句的ORDER BY
和LIMIT
子句。INSERT INTO *
tbl_name* SET *
col_name* = ...
语法。INSERT
和REPLACE
语句的DELAYED
子句。INSERT
、REPLACE
、DELETE
和UPDATE
语句的LOW_PRIORITY
子句。- 在
SELECT
语句中使用INTO OUTFILE
或INTO DUMPFILE
。参见 第 15.2.13 节,“SELECT Statement”。 - 在
SELECT
语句中的选项,如STRAIGHT_JOIN
或SQL_SMALL_RESULT
。 - 在
GROUP BY
子句中不需要命名所有选定的列。这对于一些非常特定但相当常见的查询可以提供更好的性能。参见 第 14.19 节,“聚合函数”。 - 您可以在
GROUP BY
中指定ASC
和DESC
,而不仅仅是在ORDER BY
中。 - 使用
:=
赋值运算符在语句中设置变量的能力��参见 第 11.4 节,“用户定义变量”。
- 数据类型
MEDIUMINT
- INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT")、SET
和ENUM
数据类型,以及各种BLOB
和TEXT
数据类型。AUTO_INCREMENT
、BINARY
、NULL
、UNSIGNED
和ZEROFILL
数据类型属性。
- 函数和运算符
- 为了方便从其他 SQL 环境迁移的用户,MySQL Server 支持许多函数的别名。例如,所有字符串函数都支持标准 SQL 语法和 ODBC 语法。
- MySQL Server 理解
||
和&&
运算符表示逻辑 OR 和 AND,就像 C 编程语言中一样。在 MySQL Server 中,||
和OR
是同义词,&&
和AND
也是同义词。由于这种良好的语法,MySQL Server 不支持标准 SQL 中用于字符串连接的||
运算符;请使用CONCAT()
。由于CONCAT()
接受任意数量的参数,因此很容易将||
运算符的用法转换为 MySQL Server。 - 在
value_list
具有多个元素的情况下使用COUNT(DISTINCT *
value_list*)
。 - 字符串比较默认不区分大小写,排序顺序由当前字符集的排序规则决定,默认为
utf8mb4
。要执行区分大小写的比较,应该使用BINARY
属性声明列或使用BINARY
转换,这将导致使用基��字符代码值而不是词法排序进行比较。 %
运算符是MOD()
的同义词。也就是说,*
N* % *
M*
等同于MOD(*
N*,*
M*)
。%
支持 C 程序员和与 PostgreSQL 的兼容性。=
,<>
,<=
,<
,>=
,>
,<<
,>>
,<=>
,AND
,OR
, 或LIKE
运算符可以在SELECT
语句中的输出列列表(FROM
的左侧)中使用。例如:
mysql> SELECT col1=1 AND col2=2 FROM my_table;
LAST_INSERT_ID()
函数返回最近的AUTO_INCREMENT
值。参见 Section 14.15, “Information Functions”。- 在数字值上允许使用
LIKE
。 REGEXP
和NOT REGEXP
扩展正则表达式运算符。CONCAT()
或CHAR()
函数的一个参数或两个以上参数。(在 MySQL Server 中,这些函数可以接受可变数量的参数。)BIT_COUNT()
、CASE
、ELT()
、FROM_DAYS()
、FORMAT()
、IF()
、MD5()
、PERIOD_ADD()
、PERIOD_DIFF()
、TO_DAYS()
和WEEKDAY()
函数。- 使用
TRIM()
函数修剪子字符串。标准 SQL 仅支持删除单个字符。 GROUP BY
函数STD()
、BIT_OR()
、BIT_AND()
、BIT_XOR()
和GROUP_CONCAT()
。参见 第 14.19 节,“聚合函数”。
MySQL8 中文参考(二)(5)https://developer.aliyun.com/article/1566101