MySQL的sql_mode查詢與設置


參考:https://blog.csdn.net/qq_32109909/article/details/107425697?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.not_use_machine_learn_pai

 

最近shell腳本中需要初始化數據庫,在導入腳本時報錯:

ERROR 1292 (22007) at line 278: Incorrect datetime value: '0000-00-00 00:00:00' for column 'created_at' at row 1

網上查了知道是跟mysql的sql_mode有關,去掉里面的"NO_ZERO_DATE"模式即可。

SHOW VARIABLES LIKE 'sql_mode';   #打印sql_mode
SET global sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
SHOW VARIABLES LIKE 'sql_mode';
怎么都不生效。參考了下面的資料才知道,這里應該將 global去掉或者改成session,去掉或session是對本次會話有效。
下面兩種都生效:
SHOW VARIABLES LIKE 'sql_mode';
SET session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
SHOW VARIABLES LIKE 'sql_mode';

SHOW VARIABLES LIKE 'sql_mode';
SET sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
SHOW VARIABLES LIKE 'sql_mode';

參考資料如下:

MySQL的sql_mode查詢與設置 

1,執行SQL查看

select @@session.sql_mode; 
  • 1

全局級別: 查看

select @@global.sql_mode; 
  • 1

2,修改

set @@session.sql_mode='xx_mode' set session sql_mode='xx_mode' 
  • 1
  • 2

全局級別:修改

set global sql_mode='xx_mode'; set @@global.sql_mode='xx_mode'; 
  • 1
  • 2

session均可省略,默認session,僅對當前會話有效
全局修改的話,需高級權限,僅對下次連接生效,不影響當前會話,且MySQL重啟后失效,因為MySQL重啟時會重新讀取配置文件里對應值,如果需永久生效需要修改配置文件里的值。

vi /etc/my.cnf 
  • 1
[mysqld] sql-mode = "xx_mode" 
  • 1
  • 2

保存退出,重啟服務器,即可永久生效

sql_mode常用值如下:

ONLY_FULL_GROUP_BY

對於GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那么這個SQL是不合法的,因為列不在GROUP BY從句中

NO_AUTO_VALUE_ON_ZERO

該值影響自增長列的插入。默認設置下,插入0或NULL代表生成下一個自增長值。如果用戶 希望插入的值為0,而該列又是自增長的,那么這個選項就有用了。

STRICT_TRANS_TABLES

在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做限制

NO_ZERO_IN_DATE

在嚴格模式下,不允許日期或月份為零,只要日期的月或日中含有0值都報錯,但是‘0000-00-00’除外

NO_ZERO_DATE

設置該值,mysql數據庫不允許插入零日期,插入零日期會拋出錯誤而不是警告。年月日中任何一個不為0都符合要求,只有‘0000-00-00’會報錯

ERROR_FOR_DIVISION_BY_ZERO

在INSERT或UPDATE過程中,如果數據被零除,則產生錯誤而非警告。如 果未給出該模式,那么數據被零除時MySQL返回NULL
update table set num = 5 / 0 ; 設置該模式后會報錯,不設置則修改成功,num的值為null

NO_AUTO_CREATE_USER

禁止GRANT創建密碼為空的用戶

NO_ENGINE_SUBSTITUTION

如果需要的存儲引擎被禁用或未編譯,那么拋出錯誤。不設置此值時,用默認的存儲引擎替代,並拋出一個異常

PIPES_AS_CONCAT

將"||"視為字符串的連接操作符而非或運算符,這和Oracle數據庫是一樣的,也和字符串的拼接函數Concat相類似

ANSI_QUOTES

啟用ANSI_QUOTES后,不能用雙引號來引用字符串,因為它被解釋為識別符

參考:https://blog.csdn.net/wyzxg/article/details/8787878


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM