MySQL 將預設資料庫編碼 latin1 改為 UTF8

2015-11-13 MySQL

由於某些系統在一開始建立的時候沒有想清楚,直接下 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 ..)

 

2 Replies to “MySQL 將預設資料庫編碼 latin1 改為 UTF8”

  1. 路人甲表示:

    新版最好是參考這個 https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html

    • shazi7804表示:

      這篇其實有點歷史了,感謝提供新版資訊,我已經加到文章前面提醒。

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱