create table IF NOT EXISTS `AllRooms`( `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`集团KEYID` varchar(255),
`公司KEYID` varchar(255),
`项目名称` varchar(255),
`网上项目名称` varchar(255),
`楼层` varchar(255),
`房号` varchar(255),
`面积` varchar(255),
`状态` varchar(255));
用该语句在perl中执行创建表。
my $data_base = "DBI:MysqL:$db_name:$location:$port"; my $dbh3=DBI -> connect($data_base,$db_user,$db_pass); my $data_str=encode("utf-8",decode("gbk",$_[0])); my $sth=$dbh3->prepare($data_str); open(FILE,">createtable.txt"); syswrite(FILE,"$_[0]"); close(FILE); print "\n",$data_str,"\n"; open(FILE,">createtable1.txt"); syswrite(FILE,"$data_str"); close(FILE); $sth->execute() or die "ERROR::$_[0]::$dbh3->errstr"; $dbh3->disconnect; print 'ok';
执行后发现表的列名为乱码。(在workbench中查看 和 MysqL中show create table 都是显示的乱码)
这时候 检查 Linux的环境 MysqL的环境发现都已经设为utf-8, create语句字符串也已经转码为utf-8. 输出到txt中也能正常显示。 但就是列名是乱码。
ps:检查环境方法 具体可见mysql乱码问题完美解决篇(我用的perl其他语言类推可解)
我在MysqL中 直接用这语句创建表 可以正常显示。 说明问题出在perl与MysqL的连接时。
即排除了 1.MysqL的环境的编码
2.数据源(执行语句字符串)的编码
这两个问题后
那问题应该出在 连接上。
这个时候 要在perl中连接数据库时设置字符集。
$dbh->do("SET character_set_client = 'utf8'");
$dbh->do("SET character_set_connection = 'utf8'");
执行代码改为:
my $data_base = "DBI:MysqL:$db_name:$location:$port"; my $dbh3=DBI -> connect($data_base,$db_pass); $dbh3->do("SET character_set_client = 'utf8'"); $dbh3->do("SET character_set_connection = 'utf8'"); my $data_str=encode("utf-8","$data_str"); close(FILE); $sth->execute() or die "ERROR::$_[0]::$dbh3->errstr"; $dbh3->disconnect; print 'ok';