在mysql中设置全局sql_mode


91

我试图在mysql中设置sql_mode,但是会引发错误。

命令:

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

这不是设置多种模式的正确方法吗?设置会话和全局模式的优点是什么?哪有?我有不同的用户试图用不同的UNC值更新数据库,并插入od将会话模式设置为“ NO_BACKSLASH_ESCAPES”,尽管为此我可以使用一种通用的模式。这有意义吗?

请告诉我。

谢谢。


那些错误的报价确实使我感到困扰;正如其他人所说,我确信,这绝对不仅仅因为这个原因。
dyasta

Answers:


205

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

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

这不会永久设置它,它将在每次重新启动后还原。

因此,您应该在配置文件中进行设置(例如/etc/mysql/my.cnf,在[mysqld]部分中),以便更改在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文档,以查看sql-mode选项


2
谢谢,在my.cnf中设置对我有用。对于那些有兴趣,这个页面告诉你什么默认sql_modes在5.7及以上版本: dev.mysql.com/doc/refman/5.7/en/sql-mode.html
理查德·

2
5.7版本说明!那就是问题所在。
ErnestasStankevičius17年

在实际的Web应用程序中,第二个查询有效。我只是在mysqli连接查询之后添加了另一个查询。SET SESSION sql_mode ='NO_ENGINE_SUBSTITUTION'; 谢谢乍得!
GTodorov '18年

1
在中5.7.20,对于而言 mysql.ini,使用下划线并忽略引号就可以了,就像这样:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ifedi Okonkwo

30

我解决了

正确的模式是:

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

17
警告:根据我们的经验,在MySQL重新启动后,该设置不会保留...
Chadwick Meyer

1
是的,重启后不会保留设置
prakashpoudel

4
为了在重新启动unix后保留它,我必须创建一个〜/ .my.cnf文件并添加[mysqld] sql_mode =“ <新模式>”。希望这会
拉曼·辛格

27

使用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_BYSQL模式,原因是引起问题。

我使用的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

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


14

复制到配置文件: /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 重新开始。


2
我认为sql_modesql-mode
拉曼·萨哈西

13

对于那些在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

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

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"

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 /


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"

1

我只是有一个类似的问题,其中MySQL(5.6.45)无法接受sql_mode任何配置文件。

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


1

检查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
  • 保存更改

phpmyadmin中的sql模式设置

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


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模式参考文档

添加SQL模式

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

sudo service mysql restart

希望这可以帮助 :-)


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.