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

Mysql學習篇 | MySQL表名大小寫敏感導致的問題

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

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才啟動成功。
原因:

為什麼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大小寫儲存,大寫就大寫小寫就小寫,比較時統一轉小寫比較。

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


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