gpt4 book ai didi

mysql - Perl MySQL utf8mb4 问题/可能的错误

转载 作者:行者123 更新时间:2023-11-29 04:34:36 24 4
gpt4 key购买 nike

我在 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中看到预期的表情符号。然而,当从表中读取时,我收到一个 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 |
+--------+
| 😀 |
+--------+

最佳答案

你告诉 MySQL 使用 UTF-8 进行通信,但你还需要告诉 DBD::mysql 解码数据(或者你自己做)。

你想要

my $dbh = DBI->connect('DBI:mysql:mydb:localhost', 'user', 'password', {
mysql_enable_utf8mb4 => 1,
})
or die($DBI::errstr);

这相当于

my $dbh  = DBI->connect('DBI:mysql:mydb:localhost', 'user', 'password')
or die($DBI::errstr);

$dbh->do('SET NAMES utf8mb4')
or die($dbh->errstr);

$dbh->{mysql_enable_utf8mb4} = 1;

关于mysql - Perl MySQL utf8mb4 问题/可能的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46727362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com