三層大小寫控制機制
1. 列級:BINARY 屬性 / 字符集 Collation
-- 建表指定列區分大小寫
CREATE TABLE t (name VARCHAR(10) BINARY); -- 或 CHARSET utf8 COLLATE utf8_bin
-- 查詢時臨時指定
SELECT * FROM t WHERE BINARY name = 'Clip';
utf8_general_ci:不區分大小寫(_ci = case insensitive)
utf8_bin:二進制比較,嚴格區分大小寫
2. 表名/庫名級:lower_case_table_names 系統變數
| 值 | 行為 | 適用 OS |
| 0 | 嚴格區分大小寫,磁盤按原名存儲 | Linux/Unix 預設 |
| 1 | 不區分,存儲為小寫,比較轉小寫 | Windows 預設、macOS 可選 |
| 2 | 存儲原名,比較轉小寫 | 極少用 |
修改 /etc/my.cnf(Windows my.ini):
[mysqld]
lower_case_table_names = 0
必須在初始化數據目錄前設定,修改後需重建實例,否則元數據不一致導致啟動失敗。
3. Linux vs Windows 預設差異導致遷移坑
- Windows 預設
lower_case_table_names=1,建表自動轉小寫
- Linux 預設
=0,嚴格區分
- Windows 開發 → Linux 部署時,表名大小寫不一致導致「找不到表」
Linux 下完整大小寫規則
- 庫名、表名:**嚴格區分**
- 表別名:**嚴格區分**
- 列名、列別名:**不區分**
- 變量名、用戶定義函數名:**嚴格區分**
跨平台遷移最佳實踐
- **統一命名規範**:全部小寫 + 底線分隔(snake_case),如
order_detail
- 開發機(Windows/Mac)同步設置
lower_case_table_names=0,強制區分,及早發現問題
- 遷移前用
mysqldump --lower-case-table-names=0 導出,保持原大小寫
- 目標庫同樣設置
=0
驗證指令
SHOW VARIABLES LIKE 'lower_case_table_names';
SHOW CREATE TABLE t; -- 觀察實際存儲表名大小寫
大小寫敏感不是小事,**統一 snake_case + lower_case_table_names=0** 是跨平台零故障的鐵律。
- 上一篇文章: MySQL LEFT JOIN 多表查詢 WHERE 條件寫法陷阱:子查詢預過濾避免隱式轉內連接
- 下一篇文章: MySQL 誤刪 root 用戶恢復實戰:跳過權限表啟動重建超級管理員
Copyright ©
程式碼之家 All Rights Reserved