0

我有一些我不明白的地方。

这是一段代码:

use warnings;
use strict;

my $db_name = 'xxx';
my $user    = 'xxx';
my $pw      = 'xxx';

use DBI;

my $dbh = DBI->connect("DBI:mysql:$db_name", $user, $pw) 
          || die "Could not connect to database: $DBI::errstr";


$dbh -> do('drop table umlaute;');


$dbh -> do(
  "create table umlaute (
     txt varchar(3)  primary key -- will not work if primary key enabled
   )") ||  die "could not create table";


$dbh -> begin_work;
my $sth = $dbh -> prepare ("insert into umlaute values (?)") or die "prepare failed";

for my $a ( 'a' .. 'z' , 'ä', 'ö', 'ü') {
for my $b ( 'a' .. 'z' , 'ä', 'ö', 'ü') {
for my $c ( 'a' .. 'z' , 'ä', 'ö', 'ü') {

  $sth -> execute ("$a$b$c") or die "could not insert $a$b$c"; 

}}}

$dbh->commit;

# check count
my $cnt = $dbh -> selectrow_arrayref("select count(*) from umlaute")->[0];

if ($cnt != 29*29*29) {
   print "$cnt != 29*29*29\n";
}
else {
  print "$cnt\n";
}

$dbh -> do('drop table performance_insert;');

当表umlaute上没有主键时,它将按我认为的那样工作。但是,如果我“启用”主键,它将失败。有趣的是,脚本设法插入了äö而不是ü

任何关于为什么这不起作用的提示都值得赞赏。这很可能是我没有发现的东西,所以四只眼睛看到的不止两只。

4

2 回答 2

0

这似乎是一个编码问题,您应该阅读手册部分字符集支持来解决这个问题。尝试将编码设置为 UTF-8。

于 2011-08-20T17:30:11.753 回答
0

该列最有可能具有latin1_swedish_ci排序规则。创建表时声明不同的排序规则,例如 latin1_bin。字符集和排序规则值得了解,因为如果您发现需要支持 latin1 字符集之外的字符,它可以节省您的精力。

于 2011-08-20T17:49:20.597 回答