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;
同时显示utf8
和utf8mb4
,而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
答案 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