Re: [問題] DBI與utf8
※ 引述《paulpu (paulpu)》之銘言:
: 除了use utf8
: 和
: $db_ref->do("set character set utf8");
: 之外
: 也有
: unless(utf8::is_utf8($this)){
: utf8::encode($this);
: }
: 將insert的query轉成utf8
: 但是...到資料庫裡一看
: 那些wide character都變成問號了
: 不太想用gui的東西直接import raw data
: 請教一下有人有類似的經驗或解法嗎
: thx
這個問題我也正在釐清中,當中如有錯誤請多指教,分享一下理解的心得:
以 mysql (MyISAM)為例,預設:
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 | read-only variable
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
mysql> SHOW VARIABLES LIKE 'COLLA%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci | 與 character_set_database 相關。
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
改變為 utf8:
mysql> charset utf8;
Charset changed
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 | 作用於 charset utf8;
| character_set_connection | utf8 | 作用於 charset utf8;
| character_set_database | ucs2 | 看 database 的定義
| character_set_filesystem | binary |
| character_set_results | utf8 | 可為 NULL,作用於 charset utf8;
| character_set_server | latin1 |
| character_set_system | utf8 | read-only variable
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
mysql> SHOW VARIABLES LIKE 'COLLA%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | utf8_general_ci | 作用於 charset utf8;
| collation_database | latin1_swedish_ci | 與 character_set_database 相關。
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
這關係到 collation (校對) 的定義,包含有 server、connection、database、
table 與 field 的設定,以及使用何種字元集 ucs2、utf8、latin1、big5 等。
其中 ucs2 不能當作 client character set,也就是不能
SET NAMES 'x' 或是 SET CHARACTER SET 'x','x' 如 utf8、latin1 或 big5 等。
而 SET NAMES 'x' 等價於
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;
SET collation_connection = default collation for x
SET CHARACTER SET 'x' 則等價於
SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;
mysql> charset 'x';
character_set_client = x
character_set_results = x;
character_set_connection = x
collation_connection = default collation for x
** 其中 character_set_database 與 collation_database 相關。 **
以下分為幾個部份,注意其中的編碼方式,以避免出現問號:
1. 大致上可先確認 Perl 的輸出字串是用何種編碼方式 ucs2 或 utf8,
這部份可以用 print Data::Dump->dump($str); 來觀察。
2. 再來是定義 database、table、field 的 collation (校對),如 ucs2_general_ci、
utf8_general_ci 或是 latin1_general_ci 等,會影響到字元集設定。
3. 設定與資料庫連結時的字元集設定,使用 SET NAMES 'x' 或是
SET CHARACTER SET 'x'。
4. 從資料庫回傳結果時,character_set_results 是否轉換編碼。
5. 輸出至 stdout 的編碼方式,utf8、ucs2 (wide character) 或是 big5 等。
建議參考文件:
* 第10章:字元編碼支援
http://twpug.net/docs/mysql-5.1/charset.html
* 9.1.4. Connection Character Sets and Collations
http://dev.mysql.com/doc/refman/5.1/en/charset-connection.html
* 10.5. Data Type Storage Requirements
http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.64.133
※ 編輯: liyih 來自: 140.114.64.133 (07/20 14:45)
推
07/20 17:50, , 1F
07/20 17:50, 1F
討論串 (同標題文章)
Perl 近期熱門文章
PTT數位生活區 即時熱門文章