在mysql中设置全局sql_mode

时间:2010-02-23 11:27:22

标签: mysql

我正在尝试在mysql中设置sql_mode,但它会抛出错误。

命令:

set global sql_mode='NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLE','NO_AUTO_CREATE_USER','NO_ENGINE_SUBSTITUTION'

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

请告诉我。

感谢。

13 个答案:

答案 0 :(得分:148)

BTW,如果你在MySQL中设置全局变量:

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';

这不会将其设置为永久,并且每次重启后都会恢复。

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

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

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

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

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

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

始终引用MySQL Docs 您的版本,以查看sql-mode options

答案 1 :(得分:20)

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

在我的情况下,我必须更改文件/etc/mysql/mysql.conf.d/mysqld.cnfmysql.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"

刚刚删除了ONLY_FULL_GROUP_BY sql模式,因为它导致了问题。

我正在使用ubuntu 16.04php 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

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

答案 2 :(得分:19)

我解决了。

正确的模式是:

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

答案 3 :(得分:8)

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

[mysqld]
port = 3306
sql-mode=""

MySQL重启。

或者你也可以

[mysqld]
port = 3306
SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";

MySQL重启。

答案 4 :(得分:4)

针对那些针对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语句无关紧要,因此也将其删除。

取自here

因此,您sql_mode可能是这样的:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

或者,如果您使用的是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}

答案 5 :(得分:3)

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

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

永久更改:转到配置文件/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"

答案 6 :(得分:2)

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

检查当前的SQL_mode

mysql> SELECT @@sql_mode;

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

nano /etc/mysql/conf.d/<filename>.cnf 

包含您的sql_mode内容

[mysqld]
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

重启Mysql

mysql> sudo service mysql stop
mysql> sudo service mysql start

我们在文件夹 /etc/mysql/conf.d / 中创建一个文件 因为在主配置文件 /etc/mysql/my.cnf 中 编写该命令以包含文件夹 /etc/mysql/conf.d /

中的所有设置文件

答案 7 :(得分:2)

检查sql_mode的文档

方法1:

检查sql_mode的默认值:

SELECT @@sql_mode //check current value for sql_mode

SET GLOBAL sql_mode = "NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

方法2:

访问phpmyadmin来编辑您的sql_mode

  • 登录phpmyadmin并打开localhost
  • 位于菜单项顶部的变量顶部,并搜索 sql模式
  • 单击编辑按钮根据您的要求修改sql_mode
  • 保存更改

sql mode settings in phpmyadmin

执行上述操作后重新启动服务器

答案 8 :(得分:1)

在我的情况下,我必须更改文件/etc/mysql/mysql.conf.d/mysqld.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"

答案 9 :(得分:1)

我有一个类似的问题,即MySQL(5.6.45)不会接受任何配置文件中的sql_mode

解决方案是将init_file = /etc/mysql/mysql-init.sql添加到配置文件,然后在其中执行SET GLOBAL sql_mode = '';

答案 10 :(得分:1)

在我的情况下,mysql和ubuntu 18.04

我使用此命令将其永久设置

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

在配置之后添加该行。请参见下图中突出显示的示例。

sql_mode = ""

注意:您还可以在此处添加不同的模式,具体取决于您的需求 NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

查看可用的sql modes referenceDocumentation

adding sql mode

然后保存。 保存后,您需要重新启动mysql服务,请遵循以下命令:

sudo service mysql restart

希望这会有所帮助:-)

答案 11 :(得分:0)

如果有人只想为当前会话设置它,则使用以下命令

set session sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

答案 12 :(得分:-2)

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"