1. 程式人生 > >MYSQL因為排序規則不同導致的問題的解決辦法

MYSQL因為排序規則不同導致的問題的解決辦法

之前不知道為什麼,專案的資料庫中的表雖然都是utf8的字元編碼,但排序規則有utf8_bin/utf8_unicode_ci/utf8_general_ci這3種,導致時不時會出現:

[Err] 1267 - Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='這種錯誤,意思是對於‘=’這種操作非法使用了混合的排序規則,即sql語句中‘=’左邊和右邊的列使用的排序規則是不一樣的,因為涉及的表多,不可能一個一個改,網上有種用select語句生成指令碼然後執行指令碼的方法可以對多個表中普通的欄位進行排序規則的修改,但當一個表的id是另一個表的外來鍵時,就不能修改此Id列的排序規則了,指令碼也就一樣會報錯不能使用了,手動去一個一個修改也是同樣不行的,下面記錄我的一種比較笨的解決辦法,目前完美解決我的問題,如果有更好的辦法,希望各大神在評論中講一講。我用的視覺化工具是navicat,就以此為基礎開始操作:

1.在當前資料上右鍵“匯出資料和結構”,將資料庫匯出到.sql檔案中;

2.使用文字編輯器(我的是notepad++)開啟此檔案,搜尋‘utf8_bin’全部替換為'utf8_general_ci',搜尋'utf8_unicode_ci'全部替換為‘utf8_general_ci’;

3.儲存編輯;

4.刪除原資料庫;

5.新建一個同名數據庫,設定編碼為‘utf-8’,排序規則為‘utf8_general_ci’;

6.選擇此資料庫執行sql檔案;

至此所有步驟完成,需要說明的是使用Hibernate自動建表時表的編碼和排序規則會繼承資料庫的編碼和排序規則,列的編碼和排序規則又會繼承表的編碼和排序規則,故第5步中如果將排序規則設為‘utf8_general_ci’會導致執行的sql檔案中如果有的表沒有顯示指定編碼或排序規則就會使用資料庫的編碼或排序規則,以及以後新建的表會使用資料庫的編碼和 排序規則又會導致排序規則不一致的問題,故第5步和你在sql檔案中替換的排序規則必須一致。

另外需要注意的是,如果存在儲存過程和檢視,匯入時可能會報語法錯誤,這不是sql檔案的問題,可能是navicat的問題或者MySQL的問題,解決辦法為:

1.開啟sql檔案,將sql檔案中建立儲存過程和建立檢視的語句剪下到一個txt文字檔案中;

2.儲存sql檔案,此時sql檔案中只有建立表和插入資料的sql語句;

3.選擇資料庫匯入此sql檔案,此時應該就能成功匯入不會報錯;

4.建立一個查詢,將txt檔案中的內容複製到查詢中,執行查詢,此時應該就可以成功建立檢視以及儲存過程並且不會報錯了。

完。