---------- 20190311 lower-case-table-names MySQL表名大小寫敏感導致的問題 ref: https://www.itread01.com/content/1546380560.html 最近在專案中遇到一個比較奇怪的小問題。在開發過程中自己測試沒有問題,但是提測後,測試的同時在測試一個功能時報錯了,日誌是: 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中的Emp為emp即可解決問題,但是為了根本解決問題,我們還須修改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大小寫儲存,大寫就大寫小寫就小寫,比較時統一轉小寫比較。 這個選項不僅僅適用於表名的大小寫敏感,同樣適用於資料庫名和表別名。