Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

解決 Linux MySQL 表不存在錯誤:大小寫敏感問題

編輯:Linux 教學

現象描述

將應用從 Windows 遷移到 Linux 後,程序報錯:

java.sql.SQLException: Table 'xxx.TB_XXX' doesn't exist

但數據庫中明明存在表 tb_xxx(小寫)。

根因分析

  • Windows:文件系統不區分大小寫,MySQL 表名存儲為文件,故不區分大小寫
  • Linux:文件系統區分大小寫,MySQL 表名對應文件名,**嚴格區分大小寫**
  • 應用 SQL 中使用大寫表名(TB_XXX),Linux 下找不到對應的小寫文件(tb_xxx)

解決方案:修改 MySQL 配置忽略大小寫

編輯配置文件

vim /etc/my.cnf
# 或 /etc/mysql/my.cnf

在 [mysqld] 區段添加

[mysqld]
# 1 = 不區分大小寫(表名存儲為小寫,比較時轉小寫)
# 0 = 區分大小寫(Linux 默認)
# 2 = 存儲按原大小寫,但比較轉小寫(Windows 默認)
lower_case_table_names = 1

重啟 MySQL 服務

service mysqld restart
# 或 systemctl restart mysqld

參數值詳細說明

值行為適用場景
0嚴格區分大小寫Linux 默認,區分表名大小寫
1**不區分大小寫(推薦遷移場景)**表名存儲為小寫,查詢自動轉小寫比較
2存儲保持原大小寫,比較轉小寫Windows 默認,遷移到 Linux 可能仍有問題

⚠ 重要注意事項

數據遷移順序關鍵:
  1. 先在 Windows 源庫導出數據(mysqldump)
  2. 在 Linux 目標庫**設置 lower_case_table_names=1 並重啟**
  3. 再導入數據
若先導入數據再改參數,已創建的表文件名大小寫不會自動改變,仍可能報錯。

替代方案(不修改配置)

  • 統一代碼規範:應用層 SQL 全部使用小寫表名(最佳實踐)
  • ORM 框架配置:Hibernate hibernate.globally_quoted_identifiers=true、MyBatis 結果映射指定小寫
  • 視圖/同義詞:為大寫表名創建小寫視圖(維護成本高)

驗證修復

mysql> SHOW VARIABLES LIKE 'lower_case_table_names';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_table_names | 1     |
+------------------------+-------+

mysql> SELECT * FROM TB_XXX;  -- 大寫查詢
-- 應正常返回數據
Copyright © Windows教程網 All Rights Reserved