2017-08-07 4 views
1

テーブルに実行されたすべてのクエリを記録するデータベーストリガーに問題があります。そのクエリに4バイトUTF- 8文字。挿入トリガーがアクティブなときにMySQLデータベースに4バイトのUTF-8文字/絵文字を挿入できない

show variables where Variable_name like 'character\_set\_%' or Variable_name like 'collation%'; 

drop database if exists my_test_db; 
create database my_test_db; 
use my_test_db; 

create table my_test_table(id int not null primary key auto_increment, jdoc json not null); 
create table my_test_table_log(id int not null primary key auto_increment, query varchar(1024) NOT NULL); 

SELECT "insert works when trigger is not active" as ""; 
insert into my_test_table(jdoc) VALUES(JSON_OBJECT("Dubai was", "")); 

DELIMITER | 
CREATE TRIGGER log_my_test_table_queries_insert 
BEFORE INSERT ON `my_test_table` 
FOR EACH ROW 
    BEGIN 
    DECLARE original_query VARCHAR(1024); 
    SET original_query = (SELECT info 
          FROM INFORMATION_SCHEMA.PROCESSLIST 
          WHERE id = CONNECTION_ID()); 
    INSERT INTO `my_test_table_log` (`query`) VALUES (original_query); 
    END; 
| 
DELIMITER ; 

SELECT "insert doesn't work when trigger is active" as ""; 
insert into my_test_table(jdoc) VALUES(JSON_OBJECT("Dubai was", "")); 

マイ出力:

+--------------------------+--------------------+ 
| Variable_name   | Value    | 
+--------------------------+--------------------+ 
| character_set_client  | utf8mb4   | 
| character_set_connection | utf8mb4   | 
| character_set_database | utf8mb4   | 
| character_set_filesystem | binary    | 
| character_set_results | utf8mb4   | 
| character_set_server  | utf8mb4   | 
| character_set_system  | utf8    | 
| collation_connection  | utf8mb4_unicode_ci | 
| collation_database  | utf8mb4_unicode_ci | 
| collation_server   | utf8mb4_unicode_ci | 
+--------------------------+--------------------+ 
10 rows in set (0.00 sec) 

Query OK, 2 rows affected (0.03 sec) 

Query OK, 1 row affected (0.00 sec) 

Database changed 
Query OK, 0 rows affected (0.03 sec) 

Query OK, 0 rows affected (0.02 sec) 

+-----------------------------------------+ 
|           | 
+-----------------------------------------+ 
| insert works when trigger is not active | 
+-----------------------------------------+ 
1 row in set (0.00 sec) 

Query OK, 1 row affected (0.00 sec) 

Query OK, 0 rows affected (0.01 sec) 

+--------------------------------------------+ 
|           | 
+--------------------------------------------+ 
| insert doesn't work when trigger is active | 
+--------------------------------------------+ 
1 row in set (0.01 sec) 

ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x94\xA5")...' for column 'INFO' at row 1 

データベースを使用して作成されているように見える

マイmysql.cnf

MySQLのバージョンは5.7.19

のUbuntu 16.04上の例のスクリプトです正しい文字セット

SHOW CREATE TRIGGER log_my_test_table_queries_insert; 
SHOW CREATE TABLE my_test_table; 
SHOW CREATE TABLE my_test_table_log; 

outputs

detailsdetailsdetails

答えて

2

を理由information_schema.processlistこれが起こりますUTF8mb3文字セットを使用しています。 (UTFはUTFmb3のエイリアスです)。トリガーが別のテーブルにinfo列のコンテンツを挿入しようとすると上記の警告は、おそらくエラーになり

mysql> select info, "" from information_schema.processlist; 
+------------------------------------------------------+------+ 
| info             | ? | 
+------------------------------------------------------+------+ 
| select info, "?" from information_schema.processlist |  | 
+------------------------------------------------------+------+ 
1 row in set, 1 warning (0,00 sec) 

Warning (Code 1366): Incorrect string value: '\xF0\x9F\x94\xA5" ...' for column 'INFO' at row 1 

:この単純なクエリは、これを説明します。

私は、クエリ文字列が期待どおりの文字セットに変換せずにprocesslistテーブルに格納されていることが問題だと思います。私はこれについてbug reportを提出しました。

+0

ニュースはありますか? – Philippe

0

これら

SHOW CREATE TRIGGER log_my_test_table_queries_insert; 
SHOW CREATE TABLE my_test_table; 
SHOW CREATE TABLE my_test_table_log; 

は、私はあなたがそれらが有効で間違った文字セットを使用して作成されたことがわかります疑うください。この1行を変更する

が十分である:

create database my_test_db CHARACTER SET utf8mb4; 

(。?私はあなたのテストケースで問題を再現することはできませんMySQLやMariaDBのどのバージョンを使用している)

+0

元の投稿にいくつかの追加情報を追加しました。データベースの作成時に文字セットを明白に明示的に指定しても問題は解決されませんでした。 utf8mb4はmysql.cnfファイル内でグローバルに指定されています – Philippe

+0

複製するとどういう意味ですか?スクリプトはあなたのマシンで問題なく実行されますか? – Philippe

関連する問題