当插入触发器处于活动状态时,无法将 4 字节 UTF-8 字符/表情符号插入 MySQL 数据库

2024-04-25

当查询包含 4 字节 UTF-8 字符时,我在使用记录对表执行的所有查询的数据库触发器时遇到问题。

My mysql.cnf https://pastebin.com/3cix3GzZ

Ubuntu 16.04 上的 mysql 版本为 5.7.19

示例脚本:

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

数据库似乎是使用正确的字符集创建的

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

outputs https://pastebin.com/yRP6RDSq

详细信息 详细信息 详细信息


发生这种情况是因为information_schema.processlist使用UTF8mb3字符集。 (UTF 是 UTFmb3 的别名)。这个简单的查询说明了这一点:

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

当触发器尝试插入内容时,上述警告可能会导致错误info列到另一个表中。

我认为问题在于查询字符串按原样存储在processlist表而不将其转换为预期的字符集。我已经提交了一份错误报告 http://bugs.mysql.com/bug.php?id=87579对这个。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当插入触发器处于活动状态时,无法将 4 字节 UTF-8 字符/表情符号插入 MySQL 数据库 的相关文章

  • H2 中的 IF 函数用于 MySQL 兼容性

    我正在使用 H2 具有 MySQL 兼容模式 针对我们使用 MySQL 的软件编写一些自动化测试 不幸的是 H2 似乎没有IF我们的许多查询都使用该函数 除了使用 DECODE 之类的东西重写我们的应用程序查询之外 它们是创建 if 函数
  • 将数据导入 MySQL Workbench

    我有一个包含 6 个表的数据库 我想将这些表导入到existingMySQL Workbench 中的数据库 我使用 phpMyAdmin 将数据库导出到 sql文件 并使用 数据导入 恢复 按钮将其导入到 MySQL Workbench
  • MySQL:插入被外键引用行的更新阻止

    让我用一个 SQL 示例来开始我的问题 这是表设置 创建表x and y With y x指的是x id 插入一行到x id 1 START TRANSACTION CREATE TABLE x id INT 11 NOT NULL AUT
  • AWS EMR PySpark 连接到 mysql

    我正在尝试使用 jdbc 通过 pyspark 连接到 mysql 我可以在 EMR 之外完成此操作 但是当我尝试使用 EMR 时 pyspark 无法正确启动 我在我的机器上使用的命令 pyspark conf spark executo
  • mysql 时钟

    我有一个包含以下元素的时钟表 id pk action emp id fk time 如果我通过了 如何选择最新的动作emp id到查询 id emp id action current time 1 1 clockin 2012 01 2
  • UTF-8 和 Unicode,0xC0 和 0x80 是什么意思?

    在过去的几天里 我一直在阅读有关 Unicode 和 UTF 8 的内容 并且经常遇到与此类似的按位比较 int strlen utf8 char s int i 0 j 0 while s i if s i 0xc0 0x80 j i r
  • 如何使用过程更改列的默认值

    这是我当前的 SQL 的样子 DELIMITER CREATE PROCEDURE updateDefaultUserRole IN rid in INT BEGIN ALTER TABLE users MODIFY rid INT 255
  • PHP 扩展 mysqli 和 nd_mysqli 之间的区别[重复]

    这个问题在这里已经有答案了 Mysqli 准备好的语句 如下所示 在以下情况下会抛出以下错误 get result 叫做 stmt connection gt prepare select column from table where i
  • 提交表单问题... Enter key

    我有一个包含几个下拉列表和一个文本字段以及一个按钮的表单 当我单击按钮时 将调用 ajax 函数 ajax 然后调用一个 php 函数 该函数从 mysql 数据库获取结果 问题是我不能通过在表单中 按回车键来完成同样的事情 页面只会刷新
  • 显示不同表中的名称而不是 ID

    我有 2 张桌子 Category带主键ID和列Name Employee带主键ID和列Category id Note Category id现在显示ID正确地 我想展示Name代替ID对于输出Employee Attempt categ
  • 从 Inno Setup 项目内部调用 MySQL

    我正在为一些使用 MySQL 的软件编写安装程序 我正在尝试运行 sql用于在安装时设置数据库的脚本 唉 我目前在执行它时遇到了很大的问题 这个问题似乎是由于这样一个事实而产生的 当你设置一条通往 sql文件内的 execute SOURC
  • 使用Ajax使用php将记录插入mysql数据库

    如何使用 Ajax 对此代码进行编码 请帮助 我是 Bignner 我已经编写了这段代码 它可以工作 但我想与 ajax 一起使用 因为不想重新加载页面 PHP文件 Code For Making Form And getting Data
  • 从 MySQL 执行 shell 命令

    我知道我正在寻找的可能是一个安全漏洞 但由于我设法在 Oracle 和 SQL Server 中做到了这一点 所以我会尝试一下 我正在寻找一种从 MySQL 上的 SQL 脚本执行 shell 命令的方法 如有必要 可以创建和使用新的存储过
  • 将数据插入多个表 PHP MySQL

    我有一个用于存储食谱的基本数据结构 它由三个表组成 如下所示 表 1 食谱 recipe id recipe name 表 2 成分 成分 ID 成分名称 表 3 配方 成分 配方 id 成分 id 我在添加新配方时遇到问题 想知道插入的最
  • 在重复键上仅更新 Null 或空值

    我有一个 mysql 查询来合并主键 IMO 上的两个表 查询工作正常 但我遇到的问题是在重复键更新时 我只想更新 wp second 表的那些没有值的字段 简而言之 在重复键上 wp second 值仅应在 null 或空时更新 这是我到
  • 从另一列计算出的列?

    给出下表 id value 1 6 2 70 有没有办法添加根据同一个表中的另一列自动计算的列 与 VIEW 类似 但属于同一个表的一部分 举个例子 calculated将是一半value Calculated应该会自动更新value变化
  • 如何对 MySQL 数据库中的 ENUM 列进行排序?

    I have colorMySQL 表中的列类型为ENUM RED YELLOW MY COLOR BLACK 还有另一个name列的类型是VARCHAR 30 我想按以下顺序获取所有表行 YELLOW首先行 排序依据name RED最后一
  • Delphi 2010:如何将 UTF8 编码的 PAnsiChar 转换为 UnicodeString?

    情况 我有一个外部 DLL 它使用 UTF 8 作为其内部字符串格式 接口函数都使用 PAnsiChar 来传递字符串 我的应用程序的其余部分使用 Delphi 的本机string类型 由于我正在使用 Delphi 2010 这将映射到Un
  • 交易已在触发条件下结束。批次已中止。派生属性

    我有这个触发器 CREATE trigger dbo DeriveTheAge on dbo Student after insert update as begin declare sid as int declare sdate as
  • 如何对表的选定列进行 mysql 转储

    我有一个要求 我必须仅对表的一列进行 mysql 转储 由于该表有太多列 我不想转储整个表 我必须将表的转储从一台服务器转移到另一台服务器 知道我该怎么做吗 如果您想获取包含架构的 mysql 转储 可以按照以下步骤完成 创建临时表 cre

随机推荐