Mysql嚴(yán)格模式小結(jié)
MySQL嚴(yán)格模式查看語(yǔ)法
-- 兩種寫法均可,效果完全一致 SELECT @@sql_mode; -- 或更清晰的寫法 SELECT @@session.sql_mode;

上述結(jié)果說(shuō)明未開啟嚴(yán)格模式
僅當(dāng)前會(huì)話開啟嚴(yán)格模式:
-- 會(huì)話級(jí)生效(僅當(dāng)前連接有效) SET @@session.sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; -- 簡(jiǎn)寫形式(效果同上) SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
永久開啟(全局生效,重啟 MySQL 仍有效)
適用于生產(chǎn)環(huán)境,需要修改 MySQL 配置文件,步驟如下:
1. 找到 MySQL 配置文件
- Linux 系統(tǒng):通常路徑為 /etc/my.cnf 或 /etc/mysql/my.cnf
- Windows 系統(tǒng):通常路徑為 MySQL安裝目錄/my.ini(如 C:\Program Files\MySQL\MySQL Server 8.0\my.ini)
2. 編輯配置文件,添加 / 修改sql_mode
在配置文件的 [mysqld] 節(jié)點(diǎn)下,添加(或修改已有的)sql_mode 配置,拼接 ONLY_FULL_GROUP_BY:
[mysqld] # 開啟GROUP BY嚴(yán)格模式(包含ONLY_FULL_GROUP_BY),保留原有其他嚴(yán)格模式配置 sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
重啟 MySQL 服務(wù)使配置生效
- Linux 系統(tǒng)(CentOS/RHEL):
# 重啟MySQL服務(wù) systemctl restart mysqld # 驗(yàn)證是否生效 mysql -u root -p -e "SELECT @@global.sql_mode;"
- Windows 系統(tǒng):
- 打開「服務(wù)」面板(右鍵此電腦 → 管理 → 服務(wù)和應(yīng)用程序 → 服務(wù))
- 找到 MySQL 服務(wù)(如 MySQL80),右鍵「重啟」
- 登錄 MySQL 執(zhí)行 SELECT @@global.sql_mode; 驗(yàn)證
四、驗(yàn)證是否成功開啟
無(wú)論哪種方式,配置后執(zhí)行以下 SQL,若結(jié)果中包含 ONLY_FULL_GROUP_BY,說(shuō)明 GROUP BY 嚴(yán)格模式已成功開啟:
-- 驗(yàn)證會(huì)話級(jí) SELECT @@sql_mode; -- 驗(yàn)證全局級(jí) SELECT @@global.sql_mode;
五、關(guān)鍵注意事項(xiàng)
- 啟用 ONLY_FULL_GROUP_BY 后,原有不符合規(guī)范的 GROUP BY 查詢會(huì)報(bào)錯(cuò)(例如:SELECT name, age FROM user GROUP BY name; 是合法的,但 SELECT name, age, address FROM user GROUP BY name; 會(huì)報(bào)錯(cuò),因?yàn)?nbsp;address 未在 GROUP BY 中且非聚合函數(shù));
- 若需兼容舊版非規(guī)范查詢,可臨時(shí)移除 ONLY_FULL_GROUP_BY(不推薦生產(chǎn)環(huán)境使用);
- 配置時(shí)需保留原有 sql_mode 中的其他標(biāo)識(shí)(如 STRICT_TRANS_TABLES),避免丟失其他嚴(yán)格模式特性。
總結(jié)
- 開啟 GROUP BY 嚴(yán)格模式的核心:添加 ONLY_FULL_GROUP_BY 到 sql_mode;
- 臨時(shí)生效:SET sql_mode = 'ONLY_FULL_GROUP_BY,原有其他配置';(當(dāng)前會(huì)話);
- 永久生效:修改 my.cnf/my.ini 的 [mysqld] 節(jié)點(diǎn),添加包含 ONLY_FULL_GROUP_BY 的 sql_mode,重啟 MySQL;
- 驗(yàn)證標(biāo)準(zhǔn):@@sql_mode 或 @@global.sql_mode 結(jié)果中包含 ONLY_FULL_GROUP_BY。
到此這篇關(guān)于Mysql嚴(yán)格模式小結(jié)的文章就介紹到這了,更多相關(guān)Mysql嚴(yán)格模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql 導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)以及函數(shù)、存儲(chǔ)過(guò)程的介紹
本篇文章是對(duì)mysql中的導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)命令以及函數(shù)、存儲(chǔ)過(guò)程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
解決Idea鏈接mysql數(shù)據(jù)庫(kù)失敗Schemas中為空的問(wèn)題
文章講述了在使用Sechemas攔截MySQL數(shù)據(jù)庫(kù)時(shí)遇到?jīng)]有數(shù)據(jù)的情況,并分析了可能是由于數(shù)據(jù)庫(kù)版本問(wèn)題導(dǎo)致的,作者建議根據(jù)自己的數(shù)據(jù)庫(kù)版本進(jìn)行選擇,如果不確定版本,可以嘗試所有版本,以解決問(wèn)題2026-01-01
MySQL實(shí)戰(zhàn)文章(非常全的基礎(chǔ)入門類教程)
半個(gè)月時(shí)間把MySQL重新鞏固了一遍,梳理了一篇幾萬(wàn)字超硬核文章,想學(xué)習(xí)mysql的朋友可以看看2023-05-05
MySQL數(shù)據(jù)庫(kù)備份問(wèn)題及處理
本文主要介紹了MySQL的日志分類、備份重要性、備份類型、備份方法及備份命令等內(nèi)容,日志包括錯(cuò)誤日志、二進(jìn)制日志、中繼日志、慢查詢?nèi)罩镜?備份方法包括冷備份、二進(jìn)制日志增量備份、第三方工具備份等,備份類型有完全備份、差異備份、增量備份等2026-05-05
詳解數(shù)據(jù)庫(kù)連接的URL的寫法及總結(jié)
這篇文章主要介紹了詳解數(shù)據(jù)庫(kù)連接的URL的寫法及總結(jié)的相關(guān)資料這里提供了四種方法1、oracle.2、MySQL.3、SQL Server.4、DB2,需要的朋友可以參考下2017-07-07
重新restore了mysql到另一臺(tái)機(jī)器上后mysql 編碼問(wèn)題報(bào)錯(cuò)
重新restore了mysql到另一臺(tái)機(jī)器上,今天新寫了一個(gè)app,發(fā)現(xiàn)在admin界面下一添加漢字就會(huì)報(bào)錯(cuò)2011-12-12

