【问题标题】:setting global sql_mode in mysql在 mysql 中设置全局 sql_mode
【发布时间】:2011-01-20 00:47:03
【问题描述】:

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

命令:

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

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

请告诉我。

谢谢。

【问题讨论】:

  • 那些错误的引用真的让我很困扰;p。正如其他人所说,我敢肯定,这绝对是不正确的。

标签: mysql


【解决方案1】:

为使用 MAMP PRO 的用户更新此内容{也适用于 MAMP 用户}。因为我似乎一直在寻找解决方案,但人们建议我应该编辑 /Applications/MAMP/tmp/mysql/my.cnf 文件夹中的 my.cnf 文件,该文件不起作用,因为它在每次重启 mysql 服务器后都会重置。

转介this document

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 服务器。这应该可以解决问题。

【讨论】:

    【解决方案2】:

    在我的例子中是 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

    然后保存。 保存后需要重启mysql服务,执行如下命令:

    sudo service mysql restart
    

    希望这会有所帮助:-)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我刚刚遇到了一个类似的问题,即 MySQL (5.6.45) 不接受来自任何配置文件的 sql_mode

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

        【讨论】:

          【解决方案5】:

          以管理员用户(可能是 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/

          中的所有设置文件

          【讨论】:

            【解决方案6】:

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

            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"
            

            【讨论】:

              【解决方案7】:

              对于为 MySQL 8 搜索此错误的人。

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

              MySQL 5.7:使用 GRANT 创建用户。相反,使用创建用户。 遵循这种做法使 NO_AUTO_CREATE_USER SQL 模式 GRANT 语句无关紧要,因此它也已被弃用。 MySQL 8.0.11:使用 GRANT 创建用户。相反,使用创建用户。遵循这种做法使 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}
              

              【讨论】:

              • 这个命令 --sql_mode=STRICT_TRAN... 是如何工作的?
              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

                顺便说一句,如果你在 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 Docs,以查看sql-mode options

                【讨论】:

                • 谢谢,在 my.cnf 中设置对我有用。对于那些感兴趣的人,这个页面告诉你 5.7 及更高版本中默认的 sql_modes 是什么:dev.mysql.com/doc/refman/5.7/en/sql-mode.html
                • 5.7版本注意!这就是问题所在。
                • 在实际的 Web 应用程序中,第二个查询有效。我刚刚在 mysqli 连接查询之后添加了另一个查询。设置会话 sql_mode = 'NO_ENGINE_SUBSTITUTION';谢谢乍得!
                • 5.7.20mysql.ini 的情况下,使用下划线并忘记引号就可以了,就像这样:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
                【解决方案10】:
                设置全局 sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                    【解决方案12】:

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

                    【讨论】:

                    • 我认为是sql_mode 而不是sql-mode
                    【解决方案13】:

                    使用 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.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模式,你应该得到你刚刚设置的模式。

                    【讨论】:

                      【解决方案14】:

                      我解决了。

                      正确的模式是:

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

                      【讨论】:

                      • 警告:根据我们的经验,这不会在 MySQL 重新启动后保留设置...
                      • 是的,重启后不会保留设置
                      • 为了在 unix 重启后保留它,我必须创建一个 ~/.my.cnf 文件并添加 [mysqld] sql_mode = "" 。希望这会有所帮助
                      猜你喜欢
                      • 1970-01-01
                      • 2013-12-20
                      • 2019-05-29
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-09-07
                      • 1970-01-01
                      相关资源
                      最近更新 更多