我正在尝试在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模式。这有意义吗?
请告诉我。
感谢。
答案 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.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.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
现在通过此查询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
执行上述操作后重新启动服务器
答案 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 reference和Documentation
然后保存。 保存后,您需要重新启动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"