﻿# MySQL 5.x 的 TRIGGER 定義必須以 UTF-8 編碼

公司有幾台舊的 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](http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html) 指令匯出時並不完整，仔細比對之後，才發現匯出的 SQL 指令中 TRIGGER 的部分只要遇到中文字就會自動截斷！

因為這個資料庫中的所有表格的的校對(Collation)都是採用 big5\_chinese\_ci，所以可能當初建立 TRIGGER 的人就是直接在 Big5 編碼下寫完 TRIGGER 並直接透過 mysql 指令建立 TRIGGER 的，導致我在使用 mysqldump 的時候遇到中文字就會直接中斷。

而我的解決方法就是透過 [phpMyAdmin](http://www.phpmyadmin.net/) 介面直接重建該表格的觸發程序(TRIGGER)，然後再重新用 [mysqldump](http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html) 指令匯出資料，之後匯入資料就完全正常了。

我另外也再測試了一下我原本的 Application，發現我就算用 UTF-8 建立 Trigger，資料庫中透過 TRIGGER 建立的資料也不會有亂碼出現（我的資料是用 big5 編碼），可見在 MySQL 內部已經針對字碼的部分自動進行了轉換。

所以未來開發的程式，最好還是盡量使用 UTF-8 當編碼標準，不然就很有可能遇到這種問題。

*P.S. 因為這個 MySQL 資料庫是很久以前的版本 Upgrade 上來的，為了與原本的應用程式相容，不得不維持使用 big5 編碼。*

**相關連結**

-   [phpMyAdmin | MySQL Database Administration Tool](http://www.google.com/search?hl=zh-TW&esrch=BetaShortcuts&q=phpmyadmin&lr=)
-   [MySQL 5.0 Reference Manual](http://dev.mysql.com/index.html) - [4.5.4. mysqldump — A Database Backup Program](http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html)
-   [MySQL 5.0 Reference Manual](http://dev.mysql.com/index.html) - [12.1.10. CREATE TRIGGER Syntax](http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html)
