公司有幾台舊的 Linux 電腦打算升級硬體,因此這陣子花了些時間在轉移資料,但我遇到一台電腦裡的 MySQL 資料庫怎樣都無法匯入成功,發生的錯誤訊息如下:
ERROR 1064 (42000) at line 63: You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to use near '' */;;
/*!50003 SET SESSION SQL_MODE="" */;;
/*!50003 CREATE */ /*!50017 DEFINE' at line 3
光從這樣的錯誤訊息讓我檢查了好久才發現,原來這個資料庫中有使用觸發程序(TRIGGER),而且這個觸發程序(TRIGGER)透過 mysqldump 指令匯出時並不完整,仔細比對之後,才發現匯出的 SQL 指令中 TRIGGER 的部分只要遇到中文字就會自動截斷!
因為這個資料庫中的所有表格的的校對(Collation)都是採用 big5_chinese_ci,所以可能當初建立 TRIGGER 的人就是直接在 Big5 編碼下寫完 TRIGGER 並直接透過 mysql 指令建立 TRIGGER 的,導致我在使用 mysqldump 的時候遇到中文字就會直接中斷。
而我的解決方法就是透過 phpMyAdmin 介面直接重建該表格的觸發程序(TRIGGER),然後再重新用 mysqldump 指令匯出資料,之後匯入資料就完全正常了。
我另外也再測試了一下我原本的 Application,發現我就算用 UTF-8 建立 Trigger,資料庫中透過 TRIGGER 建立的資料也不會有亂碼出現(我的資料是用 big5 編碼),可見在 MySQL 內部已經針對字碼的部分自動進行了轉換。
所以未來開發的程式,最好還是盡量使用 UTF-8 當編碼標準,不然就很有可能遇到這種問題。
P.S. 因為這個 MySQL 資料庫是很久以前的版本 Upgrade 上來的,為了與原本的應用程式相容,不得不維持使用 big5 編碼。
相關連結