perl DBI 链接mysql,读取数据乱码

perl DBI 链接mysql,读取数据乱码

#!/usr/bin/perl -w
        use strict;
        use DBI;
        use CGI ':standard';
        use HTML::Template;
        use encoding "UTF-8";

print header(-charset => 'UTF-8', -expires => '-1d');
my $template = HTML::Template->new(filename => './TMP/select.tl');

## define
my $wtime;
my $rtime;
my $server;
my $admin;
my $failure_time;
my $failure_desc;
my $reason;
my $measure;

my @select;

my $dbh = DBI->connect("DBI:mysql:database=server_maintenance;host=localhost",
                           "root", "123456", {'RaiseError' => 1});
my $sth = $dbh->prepare("set names utf8");  #这条去不去都一样
$sth = $dbh->prepare("select * from server_ckinfo where 1=1 order by WTIME");
$sth->execute();
while (my @row = $sth->fetchrow_array()){
        my %loop;
        $loop{id} = $row[0];
        $loop{wtime} = $row[1];
        $loop{rtime} = $row[2];
        $loop{server} = $row[3];
        $loop{admin} = $row[4];
        $loop{failure_time} = $row[5];
        $loop{failure_desc} = $row[6];
        $loop{reason} = $row[7];
        $loop{measure} = $row[8];
        push (@select,\%loop);
}
$sth->finish();
$dbh->disconnect();

$template->param( LOOPINFO => \@select );
print $template->output;

代码如上,使用到了HTML模板,数据库表里的编码是utf8,但读出来后就只是问号了
HTML 模板如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Server maintenace</title>
    <meta http-equiv="Content-Language" content="utf-8" />
    <meta http-equiv="Content-Type" content="text/htm; charset=utf-8" />
</head>
<body>
        <table>
        <tr>
                <td><B>ID</B></td>
                <td><B>warning time</B></td>
                <td><B>resovle time</B></td>
                <td><B>server</B></td>
                <td><B>admin</B></td>
                <td><B>failure_time</B></td>
                <td><B>failure_desc</B></td>
                <td><B>reason</B></td>
                <td><B>measure</B></td>
        </tr>
        <TMPL_LOOP NAME=LOOPINFO>
        <tr>
                <td><TMPL_VAR NAME=id></td>
                <td><TMPL_VAR NAME=wtime></td>
                <td><TMPL_VAR NAME=rtime></td>
                <td><TMPL_VAR NAME=server></td>
                <td><TMPL_VAR NAME=admin></td>
                <td><TMPL_VAR NAME=failure_time></td>
                <td><TMPL_VAR NAME=failure_desc></td>
                <td><TMPL_VAR NAME=reason></td>
                <td><TMPL_VAR NAME=measure></td>
        </tr>
        </TMPL_LOOP>
        </table
</body>
</html>

建表的时候编码是utf8吗?

create table xxx ( xxx ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
估计你数据库的编码不是utf8,因为perl默认的字符就是utf8的
你检查一下你的 数据库的字符类型吧
你在做insert和select之前,先执行下面的语句
$dbh->do("SET NAMES 'utf8');
试试。