【发布时间】:2018-03-25 10:32:34
【问题描述】:
我在 Debian 8 机器上使用 Perl 5.20.2 和 MySQL 5.5.57。我最近发现 MySQL 的 utf8 表仅限于三字节字符。因此,我无法存储表情符号。 所以,我尝试了应该解决这个问题的 utfmb4 表。我从 mysql 客户端内部将表从 utf8 更改为 utf8mb4:
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;
在 mytable 中存储数据似乎可行,至少我可以在 phpMyAdmin 中看到预期的表情符号。但是,当从表中读取时,我收到一个包含 3 个不可打印字符的 4 个字符的结果。以下程序应该打印两次相同的表情符号:
#!/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,请解释使用占位符如何解决 Perl 客户端中 utf8mb4 字符集的问题。
-
@Bill 我从来没有说过。只是指出好的风格。我们在力所能及的地方进行教育。 :)