还是问一个perl中文变乱码的问题

还是问一个perl中文变乱码的问题

还是问一个perl中文变乱码的问题
搜索了好多地方,试过了一些解决方法,不过都没有解决我的问题。

我的环境:
Mysql4.1(因为虚拟空间是3.23.58的,用5.0数据不兼容,所以只能用4.1的)
ActivePerl 5.8.8
中文XP系统

Mysql的编码采用gb2312,安装的时候就选了gb2312,而不是lant1。

现在用如下程序读Mysql的数据,中文的部分就变成了????,写回数据库也是???

use DBI;
use Encode;

my $dbh = DBI->connect("DBI:mysql:database=eqdkp;host=localhost", "user", "passwd") || die $DBI::errstr;

my $sth = $dbh->prepare("SELECT * FROM mcdkp_members");
$sth->execute();

while (my $scores = $sth->fetchrow_hashref()) {
$seq++;
$amember_name = $scores->{'member_name'};
$amember_earned = $scores->{'member_earned'};
$amember_spent = $scores->{'member_spent'};
$amember_adjustment = $scores->{'member_adjustment'};
$actualscore = $amember_earned - $amember_spent + $amember_adjustment;
print "$amember_name -> $actualscore\n";
$hashmember{$amember_name} = $actualscore;
my $inslin = $dbh->prepare("INSERT INTO mc_test (member_names) VALUES ('$encode_memname')");

$inslin->execute();
$inslin->finish;
}

$dbh->disconnect();

问题我猜测是编码的问题。
perl用的变量是utf8的,而mysql的是gb2312的,从mysql中读出数据到perl的时候,就产生了编码问题。
但是我试过很多解决办法,都没有效果。

比如读数据库的时候就编码转换:
my $sth = $dbh->prepare(decode('gb2312', "SELECT * FROM mcdkp_members"));

或者在用fetchrow_hashref以后转换编码:
$amember_name = decode('gb2312', $scores->{'member_name'});

以上2个方法都无法解决这个问题,请高手帮忙指点一下,应该在哪里转换编码。
data <-> connectio.
data <-> connection <-> store

简单来说,你只要保证这3个都是 gb2312 编码就行了。
data 部分,用 Encode
connection 部分,可以在连接数据库后执行 SQL 语句:set names gb2312; 也可以在创建 DBI 连接时使用 my.cnf,在 my.cnf 中指定编码。后者的优点是,自动重连不会丢失编码信息
store 部分,就是在建表时制定编码
感谢islue的回答。-- 感谢islue的回答。

mysql的设定应该没问题,因为我创建的时候用的就是gb2312。
用phpmyadmin查看,也是正常中文,没有乱码;
在mysql自带的command 查询,也都是正常的中文。

my.ini的设定里面

default-character-set=gb2312

我想问一下,在perl里面$声明的变量,本身有没有编码的?
会不会由于在读出mysql数据库的过程中,存储到perl的变量中以后就改变了编码?
我还是觉得是你连接时丢失.
我还是觉得是你连接时丢失了编码信息

[quote]my $dbh = DBI->connect("DBI:mysql:database=eqdkp;host=localhost", "user", "passwd") || die $DBI::errstr;[/quote]

这是你的连接方式,对吧?my.ini 一定要显式使用的,像这样:

[quote]my $dbh = DBI->connect("DBI:mysql:database=eqdkp;host=localhost;mysql_read_default_file=/home/anthony/my.cnf", "user", "passwd") || die $DBI::errstr;[/quote]

原谅我不知道 Windows 路径怎么写,你自己替换就是了

默认读取的是 [client] 块,也可以用 mysql_read_default_group 指定,具体见 [url=http://search.cpan.org/~capttofu/DBD-mysql-4.001/lib/DBD/mysql.pm]DBD::mysql[/url]

[quote]会不会由于在读出mysql数据库的过程中,存储到perl的变量中以后就改变了编码[/quote]

不会的,没有自动转码一说的