在mysql中设置全局sql_mode

JPr*_*Pro 70 mysql

我试图在mysql中设置sql_mode但它会抛出一个错误.

命令:

set global sql_mode='NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLE','NO_AUTO_CREATE_USER','NO_ENGINE_SUBSTITUTION'
Run Code Online (Sandbox Code Playgroud)

这不是设置多种模式的正确方法吗?设置会话和全局模式有什么好处?哪个是优先的?我有不同的用户尝试使用不同的UNC值更新数据库并且将会话模式设置为'NO_BACKSLASH_ESCAPES',尽管为此我可以使用gloabl模式.这有意义吗?

请告诉我.

谢谢.

Cha*_*yer 171

顺便说一句,如果你在MySQL中设置全局变量:

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
Run Code Online (Sandbox Code Playgroud)

这不会永久设置,并且每次重启后都会恢复.

所以你应该在配置文件中设置它(例如/etc/mysql/my.cnf在[mysqld]部分中),以便在MySQL重启后更改仍然有效:

配置文件:/etc/mysql/my.cnf

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Run Code Online (Sandbox Code Playgroud)

更新:较新版本的Mysql(例如5.7.8或更高版本)可能需要稍微不同的语法:

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)

确保sql-mode不是下划线之间有短划线,并且模式是双引号.

始终引用了MySQL的文档您的版本看到SQL模式选项.

  • 谢谢,在 my.cnf 中的设置对我有用。对于那些感兴趣的人,这个页面告诉你 5.7 及更高版本的默认 sql_modes 是什么:http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html (2认同)
  • 5.7版本注意了!那就是问题所在。 (2认同)

JPr*_*Pro 24

我解决了

正确的模式是:

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)

  • 警告:根据我们的经验,这不会在MySQL重启后保留设置... (12认同)
  • 为了在重新启动unix之后保留它,我必须创建一个〜/ .my.cnf文件并添加[mysqld] sql_mode ="<new mode>".希望这可以帮助 (4认同)

Yas*_*eja 22

使用mysql配置文件永久设置sql模式.

在我的情况下,我必须更改文件/etc/mysql/mysql.conf.d/mysqld.cnf,mysql.conf.d包括在内/etc/mysql/my.cnf.我在[mysqld]下更改此内容

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)

刚删除ONLY_FULL_GROUP_BYsql模式导致它导致问题.

我正在使用ubuntu 16.04,php 7而mysql --version给了我这个mysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper

在此更改之后运行命令

sudo service mysql stop
sudo service mysql start
Run Code Online (Sandbox Code Playgroud)

现在通过此查询检查sql模式SELECT @@sql_mode,您应该获得刚刚设置的模式.


Dev*_*pta 12

复制到配置文件: /etc/mysql/my.cnf OR /bin/mysql/my.ini

[mysqld]
port = 3306
sql-mode=""
Run Code Online (Sandbox Code Playgroud)

MySQL 重新开始.

或者你也可以

[mysqld]
port = 3306
SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
Run Code Online (Sandbox Code Playgroud)

MySQL 重新开始.

  • 我认为它是`sql_mode`而不是`sql-mode`. (2认同)

Ser*_*pov 7

对于那些在MySQL 8上搜索此错误的人。

MySQL 8.0.11从sql-mode删除'NO_AUTO_CREATE_USER'。

MySQL 5.7:使用GRANT创建用户。而是使用CREATE USER。遵循这种做法会使NO_AUTO_CREATE_USER SQL模式对于GRANT语句不重要,因此也不建议使用。MySQL 8.0.11:使用GRANT创建用户。而是使用CREATE USER。遵循这种做法会使NO_AUTO_CREATE_USER SQL模式对于GRANT语句不重要,因此也将其删除。

这里取

因此,您sql_mode可以像这样:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用的是Docker,则可以向docker-compose.yml添加下一个命令

  mysql:
    image: mysql:8.0.13
    command: --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    ports:
      - 13306:${MYSQL_PORT}
Run Code Online (Sandbox Code Playgroud)


小智 6

对于临时更改,请使用以下命令

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 
Run Code Online (Sandbox Code Playgroud)

对于永久更改:转到配置文件 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf 并添加以下行,然后重新启动 mysql 服务

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Run Code Online (Sandbox Code Playgroud)


小智 6

以管理员用户(可能是 root)访问数据库。

检查当前的 SQL_mode

mysql> SELECT @@sql_mode;
Run Code Online (Sandbox Code Playgroud)

要设置新的 sql_mode,请退出数据库,创建一个文件

nano /etc/mysql/conf.d/<filename>.cnf 
Run Code Online (Sandbox Code Playgroud)

与您的 sql_mode 内容

[mysqld]
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Run Code Online (Sandbox Code Playgroud)

重启Mysql

mysql> sudo service mysql stop
mysql> sudo service mysql start
Run Code Online (Sandbox Code Playgroud)

我们在文件夹/etc/mysql/conf.d/中创建一个文件 ,因为在主配置文件/etc/mysql/my.cnf中 ,写入的命令包含文件夹/etc/mysql/conf 中的所有设置文件。 d/