集群中的 aws aurora rds (mysql) 无法插入表情符号
aws aurora rds (mysql) in a cluster cannot insert emoji
我在群集中使用 aurora rds (mysql),无法插入表情符号。我要插入的列具有排序规则:
utf8mb4 - utf8mb4_unicode_ci
我试过使用客户端插入,也尝试过从 mysql workbench 编写查询,但在这两种情况下我只看到 ?????在现场。
我更新了 table 默认字符集:
utf8mb4
和默认排序规则:
utf8mb4_unicode_ci
但还是收到了???而不是表情符号
编辑 1:
我已经尝试编辑集群的参数组并将所有字符集值设置为 utf8mb4 并将所有排序规则值设置为 utf8mb4_unicode_ci 但仍然无法正常工作。
更改 table 的默认字符集不会改变任何现有列。你可以 运行 SHOW CREATE TABLE MyTable
看看区别。
例如,我们可以用老式的字符集创建一个table:
mysql> create table MyTable (string1 varchar(100) ) default character set = latin1;
mysql> show create table MyTable\G
*************************** 1. row ***************************
Table: MyTable
Create Table: CREATE TABLE `MyTable` (
`string1` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
接下来,我们更改 table 的默认值,但我们看到并没有更改该列。现有列会自动获得一个选项,向我们展示它实际用于字符集的内容,因为它现在不同于 table 默认值:
mysql> alter table MyTable default charset = utf8mb4;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table MyTable\G
*************************** 1. row ***************************
Table: MyTable
Create Table: CREATE TABLE `MyTable` (
`string1` varchar(100) CHARACTER SET latin1 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
默认值用于随后添加到 table 的列:
mysql> alter table MyTable add column string2 varchar(100);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table MyTable\G
*************************** 1. row ***************************
Table: MyTable
Create Table: CREATE TABLE `MyTable` (
`string1` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
`string2` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
要转换现有列,请使用转换为字符集。这将重写 table,根据需要转换每列的现有数据:
mysql> alter table MyTable convert to character set utf8mb4;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table MyTable\G
*************************** 1. row ***************************
Table: MyTable
Create Table: CREATE TABLE `MyTable` (
`string1` varchar(100) DEFAULT NULL,
`string2` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
现在两列都没有说明它们各自的字符集,因为它们匹配 table 的默认值。
您的集群参数组应设置以下选项:
- character_set_client:utf8mb4
- character_set_connection: utf8mb4
- character_set_database:utf8mb4
- character_set_server:utf8mb4
- collation_connection: utf8mb4_unicode_ci
- collation_server: utf8mb4_unicode_ci
更新后可能需要重新启动您的实例。当您连接到集群时,您希望为您的连接设置正确的排序规则,如下所示:
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
如果您在此之后 运行 SHOW VARIABLES LIKE "%collation%"
您应该看到三个变量都具有正确的排序规则 (utf8mb4_unicode_ci)。
您还需要将表和列转换为正确的字符集和排序规则,之前在 DBA Stack Exchange 上已经回答过这个问题:How to easily convert utf8 tables to utf8mb4 in MySQL 5.5
我写了一篇详细的博客 post(几年前)解释如何在 Rails 上的 Ruby 中支持表情符号和 Aurora MySQL:
我知道外部链接在这里不受欢迎,但这可以帮助处于类似情况的其他人。该指南太长,无法粘贴为答案。
我在群集中使用 aurora rds (mysql),无法插入表情符号。我要插入的列具有排序规则:
utf8mb4 - utf8mb4_unicode_ci
我试过使用客户端插入,也尝试过从 mysql workbench 编写查询,但在这两种情况下我只看到 ?????在现场。
我更新了 table 默认字符集: utf8mb4 和默认排序规则: utf8mb4_unicode_ci
但还是收到了???而不是表情符号
编辑 1:
我已经尝试编辑集群的参数组并将所有字符集值设置为 utf8mb4 并将所有排序规则值设置为 utf8mb4_unicode_ci 但仍然无法正常工作。
更改 table 的默认字符集不会改变任何现有列。你可以 运行 SHOW CREATE TABLE MyTable
看看区别。
例如,我们可以用老式的字符集创建一个table:
mysql> create table MyTable (string1 varchar(100) ) default character set = latin1;
mysql> show create table MyTable\G
*************************** 1. row ***************************
Table: MyTable
Create Table: CREATE TABLE `MyTable` (
`string1` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
接下来,我们更改 table 的默认值,但我们看到并没有更改该列。现有列会自动获得一个选项,向我们展示它实际用于字符集的内容,因为它现在不同于 table 默认值:
mysql> alter table MyTable default charset = utf8mb4;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table MyTable\G
*************************** 1. row ***************************
Table: MyTable
Create Table: CREATE TABLE `MyTable` (
`string1` varchar(100) CHARACTER SET latin1 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
默认值用于随后添加到 table 的列:
mysql> alter table MyTable add column string2 varchar(100);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table MyTable\G
*************************** 1. row ***************************
Table: MyTable
Create Table: CREATE TABLE `MyTable` (
`string1` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
`string2` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
要转换现有列,请使用转换为字符集。这将重写 table,根据需要转换每列的现有数据:
mysql> alter table MyTable convert to character set utf8mb4;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table MyTable\G
*************************** 1. row ***************************
Table: MyTable
Create Table: CREATE TABLE `MyTable` (
`string1` varchar(100) DEFAULT NULL,
`string2` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
现在两列都没有说明它们各自的字符集,因为它们匹配 table 的默认值。
您的集群参数组应设置以下选项:
- character_set_client:utf8mb4
- character_set_connection: utf8mb4
- character_set_database:utf8mb4
- character_set_server:utf8mb4
- collation_connection: utf8mb4_unicode_ci
- collation_server: utf8mb4_unicode_ci
更新后可能需要重新启动您的实例。当您连接到集群时,您希望为您的连接设置正确的排序规则,如下所示:
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
如果您在此之后 运行 SHOW VARIABLES LIKE "%collation%"
您应该看到三个变量都具有正确的排序规则 (utf8mb4_unicode_ci)。
您还需要将表和列转换为正确的字符集和排序规则,之前在 DBA Stack Exchange 上已经回答过这个问题:How to easily convert utf8 tables to utf8mb4 in MySQL 5.5
我写了一篇详细的博客 post(几年前)解释如何在 Rails 上的 Ruby 中支持表情符号和 Aurora MySQL:
我知道外部链接在这里不受欢迎,但这可以帮助处于类似情况的其他人。该指南太长,无法粘贴为答案。