集群中的aws aurora rds(mysql)无法插入表情符号

时间:2018-04-22 03:45:00

标签: mysql amazon-web-services emoji amazon-rds-aurora

我在群集中使用极光rds(mysql),无法插入表情符号。我要插入的列具有排序规则:

utf8mb4 - utf8mb4_unicode_ci

我尝试使用客户端插入,也从mysql workbench编写查询,但在这两种情况下我只看到????在现场。

我更新了表默认字符集: utf8mb4 和默认排序规则: utf8mb4_unicode_ci

但仍然得到???而不是表情符号

编辑1:

我尝试编辑群集的参数组,并将所有字符集值设置为utf8mb4,将所有归类值设置为utf8mb4_unicode_ci,但仍无效。

2 个答案:

答案 0 :(得分:4)

您的群集参数组应设置以下选项:

  • character_set_client:utf8mb4
  • character_set_connection:utf8mb4
  • character_set_database:utf8mb4
  • character_set_server:utf8mb4
  • collat​​ion_connection:utf8mb4_unicode_ci
  • collat​​ion_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

答案 1 :(得分:1)

更改表的默认字符集不会更改任何现有列。您可以运行SHOW CREATE TABLE MyTable并查看差异。

例如,我们可以创建一个包含旧式字符集的表:

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)

接下来,我们更改表的默认值,但我们看到它不会更改列。现有列自动获取一个选项,向我们显示它实际用于charset的内容,因为它现在与表默认值不同:

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)

默认用于随后添加到表中的列:

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

要转换现有列,请使用CONVERT TO CHARACTER SET。这将重写表格,如果需要,转换每列的现有数据:

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

现在两个专栏都没有提及他们各自的字符集,因为它们符合表的默认值。