由於某些系統在一開始建立的時候沒有想清楚,直接下 create database 就建立了,並沒有特別指定資料庫編碼,讓一些中文字元有可能出現亂碼的狀況。
***** 新版 MySQL 請參考官方文件「Configuring Application Character Set and Collation」
本文就是要將已經建立的資料庫修改編碼,但免不了需要停機的狀況,必須注意
修改 MySQL 環境設定
Step.1 先修改 MySQL 的環境設定,讓之後建立的資料庫都使用編碼 UTF8
$ vim /etc/my.cnf [mysqld] default-character-set=utf8 default-collation=utf8_unicode_ci character-set-server=utf8 collation-server=utf8_unicode_ci datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid #重新啟動MySQL讓設定生效 $ service mysqld restart
修改 Database 編碼為 UTF8
假設我的資料庫為 dbdata
$ mysql -uroot -p dbdata #查詢資料庫編碼 mysql> status; mysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1 Connection id: 2 Current database: dbdata Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.1.73 Source distribution Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/lib/mysql/mysql.sock Uptime: 1 min 57 sec Threads: 1 Questions: 10 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 9 Queries per second avg: 0.85
注意到 Db characterset 的編碼是 latin1
修改資料庫編碼 UTF-8
mysql> ALTER DATABASE dbdata CHARACTER SET utf8 COLLATE utf8_general_ci; #再查詢編碼 mysql> status; ... Db characterset: utf8 ...
資料庫編碼已經修改為 utf8,如果你的 Tables 很不幸的也是 latin1 建立的話,請繼續以下步驟
修改 Tables 編碼為 UTF8
把資料庫都 dump 出來進行轉碼再匯入資料庫
$ mysqldump -uroot -prootpw --default-character-set=latin1 --skip-set-charset dbdata > dbdata.sql #將latin1 取代成 utf8 $ sed -i 's/latin1/utf8/g' dbdata.sql > dbdata_utf8.sql #匯入MYSQL $ mysql -uroot -prootpw --default-character-set=utf8 dbdata < dbdata_utf8.sql
在這邊資料庫修改就告一段落了,如果你的前端頁面還是顯示亂碼,就必須從後端語言的設定著手了(php, python ..)