From ddbd9efa2217c2c1fcf0858ba42da321b6722311 Mon Sep 17 00:00:00 2001 From: TomShawn <41534398+TomShawn@users.noreply.github.com> Date: Wed, 22 Jul 2020 12:04:59 +0800 Subject: [PATCH 1/2] sql-mode: update compatibility --- TOC.md | 3 +-- mysql-compatibility.md | 8 +++++--- sql-mode.md | 38 +++++++++++++++++++------------------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/TOC.md b/TOC.md index 4a27dd248669..14e9e00a8618 100644 --- a/TOC.md +++ b/TOC.md @@ -9,8 +9,7 @@ + [TiDB 简介](/overview.md) + [What's New in TiDB 4.0](/whats-new-in-tidb-4.0.md) + [基本功能](/basic-features.md) - + 兼容性 - + [与 MySQL 的兼容性](/mysql-compatibility.md) + + [与 MySQL 的兼容性](/mysql-compatibility.md) + [使用限制](/tidb-limitations.md) + [荣誉列表](/credits.md) + 快速上手 diff --git a/mysql-compatibility.md b/mysql-compatibility.md index 32d8fa267c0f..2fe2765b8448 100644 --- a/mysql-compatibility.md +++ b/mysql-compatibility.md @@ -143,11 +143,13 @@ mysql> select _tidb_rowid, id from t; ### SQL 模式 -- 不支持兼容模式,例如:`ORACLE` 和 `POSTGRESQL`,MySQL 5.7 已弃用兼容模式,MySQL 8.0 已移除兼容模式。 +TiDB 支持大部分 [SQL 模式](/sql-mode.md)。不支持的 SQL 模式如下: -- `ONLY_FULL_GROUP_BY` 与 MySQL 5.7 相比有细微的[语义差别](/functions-and-operators/aggregate-group-by-functions.md#与-mysql-的区别)。 +- 不支持兼容模式,例如:`ORACLE` 和 `POSTGRESQL`(TiDB 解析但会忽略这两个兼容模式),MySQL 5.7 已弃用兼容模式,MySQL 8.0 已移除兼容模式。 -- `NO_DIR_IN_CREATE` 和 `NO_ENGINE_SUBSTITUTION` MySQL 用于解决兼容问题,并不适用于 TiDB。 +- `ONLY_FULL_GROUP_BY` 模式与 MySQL 5.7 相比有细微的[语义差别](/functions-and-operators/aggregate-group-by-functions.md#与-mysql-的区别)。 + +- MySQL 中的 `NO_DIR_IN_CREATE` 和 `NO_ENGINE_SUBSTITUTION` 的 SQL 模式可用于解决兼容问题,并不适用于 TiDB。 ### 默认设置 diff --git a/sql-mode.md b/sql-mode.md index a79e22975951..fe33135b9d3f 100644 --- a/sql-mode.md +++ b/sql-mode.md @@ -1,5 +1,5 @@ --- -title: SQL Mode +title: SQL 模式 aliases: ['/docs-cn/dev/reference/sql/sql-mode/'] --- @@ -26,8 +26,8 @@ Modes 是用逗号 (',') 间隔开的一系列不同的模式。使用 `SELECT @ | PIPES_AS_CONCAT | 将 "\|\|" 视为字符串连接操作符(+)(同CONCAT()),而不视为OR(支持) | | ANSI_QUOTES | 将 `"` 视为识别符,如果启用 ANSI_QUOTES,只单引号内的会被认为是 String Literals,双引号被解释为识别符,因此不能用双引号来引用字符串(支持)| | IGNORE_SPACE | 若开启该模式,系统忽略空格。例如:“user” 和 “user “ 是相同的(支持)| -| ONLY_FULL_GROUP_BY | 如果 GROUP BY 出现的列并没有在 SELECT,HAVING,ORDER BY 中出现,此 SQL 不合法,因为不在 GROUP BY 中的列被查询展示出来不符合正常现象 (支持) | -| NO_UNSIGNED_SUBTRACTION | 在减运算中,如果某个操作数没有符号,不要将结果标记为UNSIGNED (支持)| +| ONLY_FULL_GROUP_BY | 如果 GROUP BY 出现的列并没有在 SELECT,HAVING,ORDER BY 中出现,此 SQL 不合法,因为不在 GROUP BY 中的列被查询展示出来不符合正常现象(支持) | +| NO_UNSIGNED_SUBTRACTION | 在减运算中,如果某个操作数没有符号,不要将结果标记为UNSIGNED(支持)| | NO_DIR_IN_CREATE | 创建表时,忽视所有 INDEX DIRECTORY 和 DATA DIRECTORY 指令,该选项仅对从复制服务器有用 (仅语法支持)| | NO_KEY_OPTIONS | 使用 SHOW CREATE TABLE 时不会输出 MySQL 特有的语法部分,如 ENGINE ,使用 mysqldump 跨DB种类迁移的时需要考虑此选项(仅语法支持)| | NO_FIELD_OPTIONS | 使用 SHOW CREATE TABLE 时不会输出 MySQL 特有的语法部分,如 ENGINE ,使用 mysqldump 跨DB种类迁移的时需要考虑此选项(仅语法支持)| @@ -36,21 +36,21 @@ Modes 是用逗号 (',') 间隔开的一系列不同的模式。使用 `SELECT @ | NO_BACKSLASH_ESCAPES | 若启用该模式,`\` 反斜杠符号仅代表它自己(支持)| | STRICT_TRANS_TABLES | 对于事务存储引擎启用严格模式,insert非法值之后,回滚整条语句(支持)| | STRICT_ALL_TABLES | 对于事务型表,写入非法值之后,回滚整个事务语句(支持)| -| NO_ZERO_IN_DATE | 在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告 (支持) -| NO_ZERO_DATE | 在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告 (支持)| -| ALLOW_INVALID_DATES | 不检查全部日期的合法性,仅检查月份值在 1 到 12 及 日期值在 1 到31 之间,仅适用于 DATE 和 DATATIME 列,TIMESTAMP 列需要全部检查其合法性 (支持)| -| ERROR_FOR_DIVISION_BY_ZERO | 若启用该模式,在 INSERT 或 UPDATE 过程中,被除数为 0 值时,系统产生错误
若未启用该模式,被除数为 0 值时,系统产生警告,并用 NULL 代替 (支持) | -| NO_AUTO_CREATE_USER | 防止GRANT自动创建新用户,但指定密码除外 (支持)| +| NO_ZERO_IN_DATE | 在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告(支持) +| NO_ZERO_DATE | 在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告(支持)| +| ALLOW_INVALID_DATES | 不检查全部日期的合法性,仅检查月份值在 1 到 12 及 日期值在 1 到31 之间,仅适用于 DATE 和 DATATIME 列,TIMESTAMP 列需要全部检查其合法性(支持)| +| ERROR_FOR_DIVISION_BY_ZERO | 若启用该模式,在 INSERT 或 UPDATE 过程中,被除数为 0 值时,系统产生错误
若未启用该模式,被除数为 0 值时,系统产生警告,并用 NULL 代替(支持) | +| NO_AUTO_CREATE_USER | 防止GRANT自动创建新用户,但指定密码除外(支持)| | HIGH_NOT_PRECEDENCE | NOT 操作符的优先级是表达式。例如: NOT a BETWEEN b AND c 被解释为 NOT (a BETWEEN b AND c)。在部份旧版本MySQL中, 表达式被解释为(NOT a) BETWEEN b AND c (支持) | -| NO_ENGINE_SUBSTITUTION | 如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎 (仅语法支持)| +| NO_ENGINE_SUBSTITUTION | 如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎(仅语法支持)| | PAD_CHAR_TO_FULL_LENGTH | 若启用该模式,系统对于 CHAR 类型不会截断尾部空格(支持)| -| REAL_AS_FLOAT | 将REAL视为FLOAT的同义词,而不是DOUBLE的同义词 (支持)| -| POSTGRESQL | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS (支持)| -| MSSQL | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS (支持)| -| DB2 | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS (支持)| -| MAXDB | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER (支持)| -| MySQL323 | 等同于 NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE (支持)| -| MYSQL40 | 等同于 NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE (支持)| -| ANSI | 等同于 REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE (支持)| -| TRADITIONAL | 等同于 STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER(支持) | -| ORACLE | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER (支持)| +| REAL_AS_FLOAT | 将REAL视为FLOAT的同义词,而不是DOUBLE的同义词(支持)| +| POSTGRESQL | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS(仅语法支持)| +| MSSQL | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS(仅语法支持)| +| DB2 | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS(仅语法支持)| +| MAXDB | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER(支持)| +| MySQL323 | 等同于 NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE(仅语法支持)| +| MYSQL40 | 等同于 NO_FIELD_OPTIONS、HIGH_NOT_PRECEDENCE(仅语法支持)| +| ANSI | 等同于 REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE(仅语法支持)| +| TRADITIONAL | 等同于 STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER(仅语法支持)| +| ORACLE | 等同于 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER(仅语法支持)| From c87776fe92312b44b0e28f1672c676d131f77ae6 Mon Sep 17 00:00:00 2001 From: Lilian Lee Date: Tue, 28 Jul 2020 18:50:32 +0800 Subject: [PATCH 2/2] Apply suggestions from code review --- mysql-compatibility.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-compatibility.md b/mysql-compatibility.md index 2fe2765b8448..44aeba98b0b5 100644 --- a/mysql-compatibility.md +++ b/mysql-compatibility.md @@ -147,9 +147,9 @@ TiDB 支持大部分 [SQL 模式](/sql-mode.md)。不支持的 SQL 模式如下 - 不支持兼容模式,例如:`ORACLE` 和 `POSTGRESQL`(TiDB 解析但会忽略这两个兼容模式),MySQL 5.7 已弃用兼容模式,MySQL 8.0 已移除兼容模式。 -- `ONLY_FULL_GROUP_BY` 模式与 MySQL 5.7 相比有细微的[语义差别](/functions-and-operators/aggregate-group-by-functions.md#与-mysql-的区别)。 +- TiDB 的 `ONLY_FULL_GROUP_BY` 模式与 MySQL 5.7 相比有细微的[语义差别](/functions-and-operators/aggregate-group-by-functions.md#与-mysql-的区别)。 -- MySQL 中的 `NO_DIR_IN_CREATE` 和 `NO_ENGINE_SUBSTITUTION` 的 SQL 模式可用于解决兼容问题,并不适用于 TiDB。 +- MySQL 中的 `NO_DIR_IN_CREATE` 和 `NO_ENGINE_SUBSTITUTION` 的 SQL 模式可用于解决兼容性问题,并不适用于 TiDB。 ### 默认设置