mysql是默认安装, 或者编译安装的时候探测到的编码方式与你期望的不一样, 例如是latin1.
当dbi连接数据库的时候, 客户端的默认编码方式, 就是上面的默认的编码方式(例如, 你用dbi连接数据库, 运行show variablies
like 'char%'查看一下结果, 应该不是Utf8编码).

我的方法比较笨, 不过解决我们类似的问题是可行的:
使用utf8做为默认编码来重新编译一个同版本的mysql,放到某个目录;然后在/etc/ld.so.conf.d下修改(create if not
exists):
/path/to/your/new/mysql/dir/lib/mysql
/usr/lib/mysql          *(product mysql library path)*

目的是, 让dbi连的时候,用默认编码是utf8的library.

当然, 如果允许, 可以完全重新编码一个新的mysql,完全替换掉.


在 2011年9月21日 下午1:31,Zhang Jun <[email protected]>写道:

> $dbh->do("set character_set_results=binary");
>
> 乱试了这个竟然可以了, 想不通.
>
> 在 2011年9月21日 上午11:28,Zhang Jun <[email protected]>写道:
>
> 刚在linux上实验了一下:
>> 不管有没有locale, 默认看到的是"????", 执行set names utf8后就能看到貌似正确的中文.
>>
>> 而且没试use utf8, 貌似这个有性能损失的说.
>>
>> 在 2011年9月21日 上午11:19,truncatei <[email protected]>写道:
>>
>> 还有一个问题,用mysql client连上去看看数据库里存的是不是正确编码的数据,是不是写的时候就写错编码了
>>>
>>> 2011/9/21 钟声 <[email protected]>:
>>> > 不知道在哪出现的乱码? 如果是在windows的CMD,里乱码就很正常..
>>> >
>>> > 2011/9/21 ZhangJun <[email protected]>:
>>> >> On Wed, 21 Sep 2011 10:54:57 +0800 Weiqiang <[email protected]>
>>> wrote:
>>> >>
>>> >> 呃, 才看见, 我贴错了, 是设置成了utf8, 刚才那个是从类似mysqlclient的东西里弄出来的,
>>> >> 这个是脚本里查询出来的
>>> >>
>>> >> character_set_client : utf8
>>> >> character_set_connection : utf8
>>> >> character_set_database : utf8
>>> >> character_set_filesystem : binary
>>> >> character_set_results : utf8
>>> >> character_set_server : utf8
>>> >> character_set_system : utf8
>>> >>
>>> >>
>>> >>> 为啥不把所有的character_set_*都改成utf-8呢?
>>> >>>
>>> >>> On Wednesday, September 21, 2011, truncatei wrote:
>>> >>>
>>> >>>> 脚本是在什么系统运行的?win? linux?
>>> >>>> 如果是linux,看看 locale 是什么
>>> >>>>
>>> >>>> 另外,脚本的编码是不是也是utf-8,再给 开头加上 use utf8;
>>> >>>>
>>> >>>> 2011/9/21 ZhangJun <[email protected] <javascript:;>>:
>>> >>>> >
>>> >>>> > 症状: 从mysql取出的数据需要Encode::encode('utf8', $data) 才能正确显示.
>>> >>>> >
>>> >>>> > 创建数据库:
>>> >>>> > create database mydb DEFAULT CHARACTER SET utf8 COLLATE
>>> utf8_general_ci
>>> >>>> > 建表:
>>> >>>> > create table types
>>> >>>> > (
>>> >>>> >   type_id              int not null,
>>> >>>> >   type_name            varchar(16) not null,
>>> >>>> >   description          varchar(64)
>>> >>>> > )
>>> >>>> > ENGINE = MYISAM
>>> >>>> > DEFAULT CHARACTER SET = utf8
>>> >>>> > COLLATE = utf8_general_ci;
>>> >>>> >
>>> >>>> > 全部操作都是在DBI建立连接后并执行如下指令后执行的:
>>> >>>> >    $dbh->do("SET NAMES 'UTF8'");
>>> >>>> >    $dbh->do("SET CHARACTER_SET_SERVER='UTF8'");
>>> >>>> >
>>> >>>> >
>>> >>>> > mysql> show variables where variable_name like 'char%';
>>> >>>> > 'character_set_client','latin1'
>>> >>>> > 'character_set_connection','latin1'
>>> >>>> > 'character_set_database','utf8'
>>> >>>> > 'character_set_filesystem','binary'
>>> >>>> > 'character_set_results','latin1'
>>> >>>> > 'character_set_server','latin1'
>>> >>>> > 'character_set_system','utf8'
>>> >>>> >
>>> >>>> >
>>> >>>> > 我想拿出正确的utf8数据, 不想再encode
>>> >>>> > 请问问题出在哪里?
>>> >>>> > 谢谢!
>>> >>>> >
>>> >>>> > --
>>> >>>> > 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>>> >>>> > 要向此网上论坛发帖,请发送电子邮件至 [email protected] <javascript:;>。
>>> >>>> > 要取消订阅此网上论坛,请发送电子邮件至 [email protected]
>>> <javascript:;>
>>> >>>> 。
>>> >>>> > 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN访问此网上论坛。
>>> >>>> >
>>> >>>> >
>>> >>>>
>>> >>>>
>>> >>>>
>>> >>>> --
>>> >>>> 如果觉得无聊,您不妨访问Google Reader消遣 https://www.google.com/reader/view
>>> >>>> 要尝试黑版本Google,请访问 http://tinyurl.com/yk3yp7j
>>> >>>>
>>> >>>> --
>>> >>>> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>>> >>>> 要向此网上论坛发帖,请发送电子邮件至 [email protected] <javascript:;>。
>>> >>>> 要取消订阅此网上论坛,请发送电子邮件至 
>>> >>>> [email protected]<javascript:;>。
>>> >>>> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN访问此网上论坛。
>>> >>>>
>>> >>>>
>>> >>>
>>> >>> --
>>> >>> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>>> >>> 要向此网上论坛发帖,请发送电子邮件至 [email protected]。
>>> >>> 要取消订阅此网上论坛,请发送电子邮件至 [email protected]。
>>> >>> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN访问此网上论坛。
>>> >>>
>>> >>
>>> >> --
>>> >> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>>> >> 要向此网上论坛发帖,请发送电子邮件至 [email protected]。
>>> >> 要取消订阅此网上论坛,请发送电子邮件至 [email protected]。
>>> >> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>>> >>
>>> >>
>>> >
>>> > --
>>> > 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>>> > 要向此网上论坛发帖,请发送电子邮件至 [email protected]。
>>> > 要取消订阅此网上论坛,请发送电子邮件至 [email protected]。
>>> > 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>>> >
>>> >
>>>
>>>
>>>
>>> --
>>> 如果觉得无聊,您不妨访问Google Reader消遣 https://www.google.com/reader/view
>>> 要尝试黑版本Google,请访问 http://tinyurl.com/yk3yp7j
>>>
>>> --
>>> 您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
>>> 要向此网上论坛发帖,请发送电子邮件至 [email protected]。
>>> 要取消订阅此网上论坛,请发送电子邮件至 [email protected]。
>>> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>>>
>>>
>>
>  --
> 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
> 要向此网上论坛发帖,请发送电子邮件至 [email protected]。
> 要取消订阅此网上论坛,请发送电子邮件至 [email protected]。
> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>



-- 
Best regards.
Felix New

-- 
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 [email protected]。
要取消订阅此网上论坛,请发送电子邮件至 [email protected]。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

回复