当Perl错误地说:“utf8mb4不是编译字符集”时,我如何将DBI->连接()`连接到MySQL?

时间:2014-08-14 04:26:46

标签: mysql perl utf-8 character-encoding utf8mb4

old Perl script我依赖(mytop)正在绊倒MySQL字符集。

my $dbh = DBI->connect($dsn, $config{user}, $config{pass}, { PrintError => 0 });

返回:

Character set 'utf8mb4' is not a compiled character set and is not specified in the '/usr/local/share/mysql/charsets/Index.xml' file

$DBI::errstr

Can't initialize character set utf8mb4 (path: /usr/local/share/mysql/charsets/)

然而 SHOW CHARSET;同时显示utf8utf8mb4,而mysql/charsets/Index.xml仅显示utf8

我找到的一个解决方案是编辑mysql/charsets/Index.xml进行更改:

<charset name="utf8"><charset name="utf8mb4">

这实际上适用于perl脚本,但遗憾的是从utf8中删除SHOW CHARSET;并禁用某些MySQL客户端(如MySQL Workbench和PHPMyAdmin)。

我还能如何解决此错误?

显然utf8mb4已编译并可用,尽管有错误。我尝试在utf8mb4中为<charset name="utf8">添加Index.xml别名,但这也不起作用。


以下是我尝试移过的相关数据库连接代码:

my $dbh = DBI->connect($dsn, $config{user}, $config{pass},
                       { PrintError => 0 });

if (not ref $dbh)
{
    die $DBI::errstr;
}

以下是相关的my.cnf设置:

[client]
default-character-set           = utf8mb4

[mysql]
default-character-set           = utf8mb4

[mysqld]
character-set-client-handshake  = FALSE
character_set_server            = utf8mb4
collation_server                = utf8mb4_unicode_ci

2 个答案:

答案 0 :(得分:0)

我可以通过编辑my.cnf来解决此问题,如下所示。但是,我不确定我是否已经引起了尚未发现的问题。

my.cnf

[client]
default-character-set           = utf8                   # changed from utf8mb4

[mysql]
default-character-set           = utf8                   # changed from utf8mb4

[mysqld]                                                 # left [mysqld] as is
character-set-client-handshake  = FALSE
character_set_server            = utf8mb4
collation_server                = utf8mb4_unicode_ci

答案 1 :(得分:0)

使用xtrabackup时遇到同样的错误。我在my.cnf中添加了这段代码,它解决了这个问题:

[xtrabackup]
default-character-set           = utf8 

我将my.cnf中的[client]和[mysql]部分留给utf8mb4连接到其他服务器。

由于xtrabackup进行二进制备份,我认为将utf8设置为xtrabackup只会对备份数据产生任何副作用。

我不知道是否有使用perl进行连接的解决方案。也许你应该为你的脚本找到一种方法来阅读my.cnf并为脚本创建一个自定义部分来读取自定义的“default-character-set”

编辑:

我已经搜索并找到了解决方案,请检查这是否有效。 在创建连接之前设置此项:

mysql_read_default_group = "perl"

并在my.cnf

中创建自定义栏目
[perl]
default-character-set           = utf8