2011/04/14

早期寫mysql資料庫編碼 latin1 可以配合 mysqldump 修正的方式

還有在用 big5 還有 latin1 編碼的資料庫嗎?
可試著用 mysqldump 配合編碼指定轉換成為 utf8 的格式...

* 資料庫編碼問題
在以前 MySQL 預設的語系是 latin1 這語系是給拉丁語系的國家使用的,
但是以前很多開發者沒有去注意這一段都使用這種語系在做 sql 的工作,
但有時候會出現一些問題。
例如:某兩個中文字在一起就會產生亂碼,中間夾各空白就又好了。

現在 Unicode 的環境已經很成熟了, UTF-8 編碼目前也是大家遵循的標準,
但這些以前的資料如果拿出來使用可以指定預設編碼匯出後再匯入到UTF-8標準
編碼內的資料庫,或許就可以把這問題解決。
--default-character-set=latin1 指定預設編碼輸出。

範例:mysqldump with 預設編碼輸出 --default-character-set=latin1

mysqldump post2 -h localhost -u post --password=密碼
--default-character-set=latin1 > post2.sql

* dump 出來後請看一下文字檔,記得把表格敘述改成 CHARSET=utf8 再匯到新的表格指定 UTF8 編碼

CREATE TABLE `CONDUCT` (
  `班級座號` varchar(9) DEFAULT NULL,
  `導師評分` decimal(15,5) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
* 編碼請參考:http://dev.mysql.com/doc/refman/5.6/en/charset-connection.html

* 為了避免語系的悲劇再次重演,你可以這樣做。在 mysql 系統的 /etc/mysql/my.cnf 檔案加入類似這樣的設定,直接綁定預設為 utf8

[mysqld]
default-character-set=utf8
  
[client]
default-character-set=utf8
init_connect='SET NAMES utf8'

* 寫程式的時候記得要輸出 mysql_query("SET NAMES 'utf-8'"); 這一行,告訴 mysql 你要用 utf8 輸出。你可以把他寫成 include 檔案,直接寫好免得協同作業有人不小心又寫爛了

$host = "localhost";
 $ac = "使用者名稱"; 
 $pw = "密碼"; 
 $db = "資料庫名稱"; 
 
 $link = mysql_pconnect($host, $ac, $pw);
 mysql_query("SET NAMES 'utf-8'");
 mysql_select_db($db, $link);

* 還原 mysqldump  還原的方式,就把資料倒回去即可。


a01@sqldebian:~/backup$ mysql a01 -u a01 -h 127.0.0.1 --password=密碼 < a01.sql

需要注意:
這個 *.sql 的匯出中會帶有自動判斷 db 存不存在的判斷式,如果原db 存再匯自動刪除 db 後匯入。

沒有留言: