1. 程式人生 > >MySQL表名大小寫敏感導致的問題

MySQL表名大小寫敏感導致的問題

cto should 文章 過程 pan exception 表示 別名 rec

最近在項目中遇到一個比較奇怪的小問題。在開發過程中自己測試沒有問題,但是提測後,測試的同時在測試一個功能時報錯了,日誌是:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘testdb.Emp‘ doesn‘t exist
  • 1

於是乎打開數據庫客戶端,發現testdb數據庫有這張表,真是奇怪。項目本地測試還是沒問題,糾結了半天,才留意到代碼中表名是Emp,而數據庫中是emp。原來是表名大小寫敏感問題。之前一直沒有在意這個問題。

變量lower_case_table_names

為什麽本地開發沒問題,但是測試環境就提示表不存在呢?因為本地的windows開發環境,默認是大小寫不敏感。而測試環境的linux是敏感的。
本地windows我們執行命令,查看自己電腦中的mysql系統變量可以看到:

show variables like ‘%lower_case_table_names%‘;
  • 1

結果:
技術分享圖片
值為1,表示是大小寫不敏感,而linux環境的mysql是0.

修改變量lower_case_table_names

為什麽會出現這個問題,主要是因為開發和測試環境不一致導致的,這也是有時測試環境完全沒問題,一到生產就出詭異問題的原因之一。所以,我們除了讓測試同事認真測試外,最好本地和測試環境還是一致。

對當前這個問題,我們直接修改SQL中的Empemp即可解決問題,但是為了根本解決問題,我們還須修改mysql的環境變量,也就是將lower_case_table_names的值改為0.
修改方法:
1. 找到mysql的安裝位置
2. 找到主目錄下的my.ini配置文件
3. 在[mysqld]節點下添加lower_case_table_names=0
4. 重啟mysql服務

在配置的時候,很可能遇到這些問題:
Q:my.ini在哪?
A:一般在安裝路徑下。之前我一直修改目錄下的my.ini,重啟還是無效。上網求助後,發現沒有使用這個配置,而是在任務管理、服務中右鍵屬性,看到可執行文件中指定的文件:

技術分享圖片
Q:為什麽修改了屬性後,服務啟動不了了。
A:在一臺電腦中MySQL成功啟動,但是另一臺一直啟動不了。初步確定是操作系統的原因,一臺是win7啟動不了。另一臺win10能夠修改後啟動並生效。最終win7那臺設置了2才啟動成功。
原因:

https://dev.mysql.com/doc/refman/5.6/en/identifier-case-sensitivity.html
Use lower_case_table_names=0 on Unix and lower_case_table_names=2 on Windows

為什麽windows不能取0?

官方文檔給出了答案,說白了就是操作系統是不支持大小寫敏感的文件系統。

You should not set lower_case_table_names to 0 if you are running MySQL on a system where the data directory resides on a case-insensitive file system (such as on Windows or OS X).

我們可以測試一下,在D盤建一個文件,命名為test.txt,再建一個文件夾叫Test.txt。我們會得到一串提示,操作系統把test和Test當做相同的字符串了:
技術分享圖片

在下面將取值範圍時,我們會看到0和2的區別。

變量lower_case_table_names的取值

取值範圍有三個,分別是0、1、2.
1. 設置成0:表名按你寫的SQL大小寫存儲,大寫就大寫小寫就小寫,比較時大小寫敏感。
2. 設置成1:表名轉小寫後存儲到硬盤,比較時大小寫不敏感。
3. 設置成2:表名按你寫的SQL大小寫存儲,大寫就大寫小寫就小寫,比較時統一轉小寫比較。

這個選項不僅僅適用於表名的大小寫敏感,同樣適用於數據庫名和表別名。


更多的資料,可以參考官方文檔系統變量部分:

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_lower_case_table_names

文章標簽: mysql數據庫

MySQL表名大小寫敏感導致的問題