setting global sql_mode in 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’,我认为为此设置一个全局模式是有意义的。这说得通吗?

Please let me know.

谢谢。

386024 次浏览

我解决了。

正确的模式是:

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

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

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

This will not set it 永久性的, and it will revert after every restart.

So you should set this in your config file (e.g. /etc/mysql/my.cnf in the [mysqld] section), so that the changes remain in effect after MySQL restart:

配置文件:/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 模式选项

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

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

MySQL restart.

或者你也可以这么做

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

重启 MySQL

Setting sql mode permanently using mysql config file.

在我的情况下,我必须修改文件 /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"

只是删除了 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 模式,您应该得到刚才设置的模式。

In my case i have to change file /etc/mysql/mysql.conf.d/mysqld.cnf change this under [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"
set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

对于那些为 MySQL8搜索这个错误的人来说。

MySQL 8.0.11从 sql 模式中删除‘ NO _ AUTO _ CREATE _ USER’。

MySQL 5.7: Using GRANT to create users. Instead, use CREATE USER. 按照这种做法,使用 NO _ AUTO _ CREATE _ USER SQL 模式 无关紧要的 GRANT 语句,因此也不推荐使用 8.0.11: 使用 GRANT 来创建用户。相反,使用 CREATE USER。按照这种做法,使用 NO _ AUTO _ CREATE _ USER SQL 模式 对于 GRANT 语句来说无关紧要,因此它也被删除。

取自 给你

So, your sql_mode can be like this:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

或者,如果您使用 Docker,您可以将下一个命令添加到 码头作曲

  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}

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

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

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

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

对于永久性的更改: 转到配置文件/etc/my.cnf 或/etc/mysql/mysql.config.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"

Access the database as the administrator user (root maybe).

检查当前 SQL _ mode

mysql> SELECT @@sql_mode;

To set a new sql_mode, exit the database, create a file

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

我们在 < strong >/etc/mysql/config.d/文件夹中创建一个文件 因为在主配置文件 /etc/mysql/my.cnf中 该命令将包含文件夹 < strong >/etc/mysql/config.d/中的所有设置文件

我也遇到过类似的问题,MySQL (5.6.45)无法从任何配置文件中接受 sql_mode

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

检查 Sql _ mode的文档

方法一:

检查 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";

方法二:

访问 phpmyadmin 以编辑 sql_mode

  • 登录 phpmyadmin 并打开 localhost
  • 顶部的 变量目前在顶部的菜单项,并搜索出 Sql 模式
  • 单击编辑按钮根据需要修改 sql _ mode
  • Save the changes

sql mode settings in phpmyadmin

Restart server after executing above things

在我的例子中是 mysql 和 ubuntu 18.04

我使用这个命令永久地设置它

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

在配置后面添加这一行。参见下图中突出显示的示例。

sql_mode = ""

注意: < em > 您也可以在这里添加不同的模式,这取决于您的需要 NO _ Backslash _ ESCAPES,STRICT _ TRANS _ TABLE,NO _ AUTO _ CREATE _ USER,NO _ Engine _ SU替换

See Available Sql 模式引用 and Documentation

adding sql mode

那就保存。 保存之后,需要重新启动 mysql 服务,请按照下面的命令操作:

sudo service mysql restart

希望这能有所帮助: -)

为使用 MAMP PRO 的用户更新这个命令{也适用于 MAMP 用户}。因为我似乎卡住了找到一个解决方案,但人们建议我应该编辑 /Applications/MAMP/tmp/mysql/my.cnf文件夹中的 my.cnf文件不工作,因为它得到重置后,每次重启 mysql 服务器。

Referring 这份文件:

MySQL 的配置文件“ my.cnf”可以在这里找到: “/Applications/MAMP/tmp/mysql/my.cnf”。请注意: 编辑此文件 不工作,因为它将被覆盖每次 MySQL 重新启动 通过 MAMP PRO 使用从 MySQL 创建的“ my.cnf”文件 您必须编辑此模板(菜单文件 > 打开模板 > 使用 MySQL (my.cnf) > 5.7.30手动修改 MySQL 配置 不建议将“ my.cnf”文件添加到其他位置 可以使用 MySQL 模板处理配置方面。

完成后,在 my.cnf 文件中添加以下内容:

[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

重新启动 Mysql 服务器,应该就可以了。