標籤:inf tty 改變 href markdown 自己 tor search 文章
最近在項目中遇到一個比較奇怪的小問題。在開發過程中自己測試沒有問題,但是提測後,測試的同時在測試一個功能時報錯了,日誌是:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘testdb.Emp‘ doesn‘t exist
於是乎開啟資料庫用戶端,發現testdb資料庫有這張表,真是奇怪。項目本地測試還是沒問題,糾結了半天,才留意到代碼中表名是Emp
,而資料庫中是emp
。原來是表名大小寫敏感問題。之前一直沒有在意這個問題。
變數lower_case_table_names
為什麼本地開發沒問題,但是測試環境就提示表不存在呢?因為本地的windows開發環境,預設是大小寫不敏感。而測試環境的linux是敏感的。
本地windows我們執行命令,查看自己電腦中的mysql系統變數可以看到:
show variables like ‘%lower_case_table_names%‘;
結果:
值為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才啟動成功。
原因:
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表名大小寫敏感導致的問題