作者liyih ()
看板Perl
标题Re: [问题] DBI与utf8
时间Tue Jul 20 14:44:20 2010
※ 引述《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)
1F:推 cutecpu:推!好详细呀 07/20 17:50