我在Debian 8机器上使用Perl 5.20.2和MySQL 5.5.57。我最近发现MySQL的utf8表限于三字节表。因此我无法储存emojis。 所以,我尝试了utfmb4应该解决这个问题的表格。我改变了表从UTF8到utf8mb4从MySQL客户端中:在MYTABLEPerl MySQL utf8mb4问题/可能的bug
ALTER DATABASE `mydb` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE `mydb`.`mytable` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `mydb`.`mytable` CHANGE `object` `object` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
存储数据似乎工作,至少我可以看到在phpMyAdmin预期的表情符号。但是,从表中读取时,我会收到一个4个字符的结果,其中包含3个不可打印的字符。下面的程序应该打印相同的表情符号两次:
#!/usr/bin/perl
use 5.10.1;
use warnings;
use strict;
use DBI;
binmode(STDOUT, ':utf8');
my $object = "\x{1F600}";
my $hd_db = DBI->connect('DBI:mysql:mydb:localhost', 'user', 'password');
$hd_db->do('SET NAMES utf8mb4');
# cleanup
my $delete = $hd_db->prepare("DELETE FROM mytable");
$delete->execute;
my $insert = $hd_db->prepare("INSERT INTO mytable (object) VALUES ('" . $object . "')");
$insert->execute;
my $select = $hd_db->prepare("SELECT * FROM mytable");
$select->execute;
my $row = $select->fetchrow_hashref;
say $object;
say $row->{'object'};
预期输出:
实际输出:
�
好像对我的错误。任何建议如何解决它?
编辑:从mysql客户端上选择该数据也显示了预期的表情符号
mysql> SET SESSION CHARACTER_SET_CLIENT = utf8mb4;
mysql> SET SESSION CHARACTER_SET_RESULTS = utf8mb4;
mysql> SELECT * FROM mytable;
+--------+
| object |
+--------+
| |
+--------+
你应该真的使用占位符。 – simbabque
您是否在提及准备报表?我通常这样做,但这似乎并不相关 – Marcus
它是相关的,我花时间指出了它;-) – simbabque