背景:由於項目開始時數據庫設計經驗不足,數據庫名和部分數據表名都含有大寫字母。但問題是,Linux上數據庫名和表名是區分大小寫的,而Windows上是不區分大小寫的。結果就是在看本地的數據庫的時候,對着寫的代碼是小寫的表名,后來傳到服務器上卻發現報錯,幾經審查才發覺是表名的大小寫不統一的問題。真是天坑啊,坑了自己也坑了小伙伴。怎么辦呢?代碼已經比較多了,不太可能一下子就把代碼里面的表名都改過來。網上看到說設置 lower_case_table_names 可以使Linux上的數據庫表名不區分大小寫,那就試試吧。
ACTION1:直接修改服務器上 lower_case_table_names=1並重啟 ,結果網站掛掉了,說找不到數據庫!而本地通過MySQL-Front連接到服務器,顯示有小寫的 awzthink,但是點進去卻說 "awzthink"數據庫不存在 這樣的話。第一次嘗試失敗,只能把配置先改回來,網站繼續運行。
分析:這樣看來,似乎代碼本來用的大寫awzThink和遠程工具用的全小寫awzthink都找不到那個數據庫,那就想到直接把數據庫名直接改為全小寫。但是MySQL並沒有提供修改數據庫名的功能,所以只能新建數據庫以及配置數據庫用戶,然后把所有數據表復制過去,再修改代碼中的數據庫配置。因為白天網站有一定流量,於是把這項任務安排是深夜。
ACTION2:是夜月黑風高,在服務器上把數據表復制到新的數據庫中去,修改代碼中的數據庫配置(就只有一行),然后修改數據庫自動備份腳本,上傳。OK,網站運行正常,數據導出來查看也沒有出入。再次嘗試設置 lower_case_table_names=1並重啟,結果那些有大寫字母的表還是查詢不出來,只好把此配置改回來。
分析:到這一步,數據庫名已經改為小寫,雖說對代碼優化還是沒什么幫助,但想要設置lower_case_table_names還是得必須經過這一步,就是必要不充分條件。對於為什么配置這個選項還是沒有把傳說中的大小寫問題修好,還是要詳細了解lower_case_table_names這個參數是做什么用的。
分析:后來百度搜索到 ITEYE上的一篇博文 ,終於大概明白是怎么一回事。簡單歸納就是:為0時(Linux默認),大小寫敏感,創建和查詢都是區分大小寫;為1時,創建表以小寫,查詢表也是以小寫;為2時,創建表區分大小寫,查詢表以小寫。這樣說的話應該就明白了,在Linux上如果本來是以有大寫字母創建的表和數據庫,如果后來配置設置為1或2時,那么就無論如何都查詢不出來了。這個只對表名和數據庫名,字段名是所有系統都區分大小寫。所以解決辦法是,修改表名為小寫,然后設置lower_case_table_names=1並重啟
ACTION3:再到凌晨,先截圖保存現在的數據庫表名,在網站低峰期修改表名為小寫,再修改這個配置項,然后重啟MySQL。注意修改表名到重啟MySQL成功之前這一段時間,代碼運行是會報錯的。重啟MySQL之后,網站就可以正常運行了。而代碼中的SQL語句表名比較多而繁雜,可以對着截圖以后慢慢改。
END:掃地完畢,小伙伴們可以安心地寫MySQL了,不用再煩惱大小寫問題了。對於原來代碼中的大寫表名,等閑一點再批量查找修改吧。
TIPS:最后提醒大家,數據庫名和表名千萬、千萬、千萬不要有大寫。
附:修改lower_case_tables_names配置項的方法>>>
1、ROOT用戶登錄,vi /etc/my.cnf
2、找到 [mysqld],在里面加入一行 lower_case_table_names=1
3、重啟數據庫 service mysqld restart