Mysql

升級到 MySQL 5.6 後將 sql_mode 設置為“空白”

  • July 29, 2019

將 MySQL 從 5.5 升級到 5.6 後,我們的一些應用程序遇到了問題,需要將 sql_mode 設置為空白來解決這個問題。我添加sql_mode = ''了,my.cnf但對 mysql 設置沒有影響。

如何保持 sql_mode 空白?

序幕

在我的組織中,有人問過我同樣的問題,因為每個人都在使用 MySQL 5.5。在過去的 8 個月中,所有數據庫伺服器都升級到了 MySQL 5.6。一些客戶端應用程序也受到sql_mode變化的影響。

根本原因

我剛剛發現了為什麼您所做的不起作用並且解決方法非常簡單。

根據MySQL 5.5 文件, sql_mode 預設為空白 sting

根據MySQL 5.6 Documentation, sql_mode 預設為

  • MySQL 5.6.5 及後面的空白字元串
  • NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES在 5.6.6 和 GA

好的,我希望你坐下。

這是 Oracle 在 MySQL 5.6 中實現sql_mode的懶惰方式:有一個附加my.cnf文件。

如果你跑

cat /usr/my.cnf

您將看到以下內容

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[mysqld]

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin

# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = .....

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

見第 28 行?

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

解決方案

STEP 01 : 註釋掉第 28 行/usr/my.cnf

#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

STEP 02 :手動設置sql_mode

mysql> SET GLOBAL sql_mode = '';

而已 !!!

結語

  • STEP 01防止重新啟動 mysqld 更改sql_mode
  • STEP 02現在設置sql_mode,因此不需要立即重新啟動 mysqld

試一試 !!!

對於 5.7.13(可能還有其他 5.7 變體),以下技巧有效:

my.cnf

sql_mode=ALLOW_INVALID_DATES

並重新啟動伺服器。如果您不想重新啟動,您可以這樣做:

set global sql_mode='ALLOW_INVALID_DATES'

然後mysqld忘記其所有迂腐的預設設置並表現得像預設配置的 5.5。

引用自:https://dba.stackexchange.com/questions/109053