CREATE TABLE .. TYPE=""
关于SQL 转储文件中语法的补充说明
TLDR:如果您仍然CREATE TABLE ... TYPE="..."
在由第三方工具生成的 SQL 转储文件中获得语句,那肯定表明您的服务器配置为使用默认sqlmode
的MYSQL40
or MYSQL323
。
很长的故事
正如其他人所说,该TYPE
论点CREATE TABLE
在 MySQL 中已被弃用了很长时间。mysqldump
正确使用该ENGINE
参数,除非您明确要求它生成向后兼容的转储(例如在最高 5.7--compatible=mysql40
的版本中使用)。mysqldump
但是,许多外部 SQL 转储工具(例如,那些集成在 MySQL 客户端中的工具,如 phpmyadmin、Navicat 和 DBVisualizer,以及外部自动备份服务(如 iControlWP)使用的工具)并没有特别意识到这一变化,而是依赖于为每个表提供表创建语句的SHOW CREATE TABLE ...
命令(并且明确表示:这实际上是一件好事)。但是,如果变量设置为or SHOW CREATE TABLE
,实际上会产生过时的语法,包括参数。TYPE
sqlmode
MYSQL40
MYSQL323
因此,如果您仍然CREATE TABLE ... TYPE="..."
在第三方工具生成的 SQL 转储文件中获得语句,则很可能表明您的服务器配置为使用默认sqlmode
的MYSQL40
or MYSQL323
。
这些sqlmode
s 基本上配置 MySQL 以保留一些向后兼容的行为,并且默认使用它们在几年前被广泛推荐。然而,如果没有这些模式,您仍然有任何无法正常工作的代码是极不可能的。无论如何,MYSQL40
和MYSQL323
其他几个类似sqlmode
的 s 本身已被弃用,并且在 MySQL 8.0 及更高版本中不受支持。
如果您的服务器仍然配置有这些sqlmode
s,并且您担心如果更改这些旧程序可能会失败,那么一种可能性是通过在连接后立即sqlmode
执行来为该程序设置本地。SET SESSION sql_mode = 'MYSQL40';
请注意,这仅应被视为临时补丁,在 MySQL 8.0 及更高版本中不起作用。
不涉及重写 SQL 查询的更面向未来的解决方案是确定需要启用哪些兼容性功能,并且仅启用那些,基于每个程序(如前所述)。默认值sqlmode
(即,在服务器的配置中)最好不要设置(它将使用当前版本的官方 MySQL 默认值)。sqlmode
(从 MySQL 5.7 开始)的完整列表在此处描述: https ://dev.mysql.com/doc/refman/5.7/en/sql-mode.html 。