2015年11月13日 星期五

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

由於某些系統在一開始建立的時候沒有想清楚,直接下 create database 就建立了,並沒有特別指定資料庫編碼,讓一些中文字元有可能出現亂碼的狀況。

 

本文就是要將已經建立的資料庫修改編碼,但免不了需要停機的狀況,必須注意



 

修改 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 ..)

 

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

沒有留言:

張貼留言