Re: [問題] DBI與utf8

看板Perl作者時間15年前 (2010/07/20 14:44), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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
文章代碼(AID): #1CHKN6Rp (Perl)
討論串 (同標題文章)
本文引述了以下文章的的內容:
0
2
完整討論串 (本文為第 2 之 2 篇):
1
1
0
2
文章代碼(AID): #1CHKN6Rp (Perl)