私はDebian 8マシンでPerl 5.20.2とMySQL 5.5.57を使用しています。私は最近、MySQLのutf8テーブルが3バイトのcharacetersに限定されていることを発見しました。結果として、私は絵文字を保存できません。 それで、私は問題を解決するはずのutfmb4テーブルを試しました。私はmysqlクライアント内からutf8mb4するUTF8からテーブルを変更:mytableは中のデータを保存するPerl MySQL 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;
は、少なくとも私は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'};
出力:
実際の出力:
�
は私にはバグのように思えます。どのようにそれを回避するための任意の提案?
EDITは:mysqlクライアント内からデータを選択することも予想される絵文字に
mysql> SET SESSION CHARACTER_SET_CLIENT = utf8mb4;
mysql> SET SESSION CHARACTER_SET_RESULTS = utf8mb4;
mysql> SELECT * FROM mytable;
+--------+
| object |
+--------+
| |
+--------+
実際にはプレースホルダを使用する必要があります。 – simbabque
あなたはprepare文を参照していますか?私は通常そうしていますが、それはここではあまり意味がないと思われます – Marcus
私はそれを指摘する時間がかかりました;-) – simbabque