首页 > 解决方案 > 表情符号在 ajax 后在 MySQL 表列和 HTML 中呈现,但在页面重新加载后不呈现。为什么?

问题描述

我已经实现了一个表情符号选择器,用于在我的 Spring & Thymeleaf 网络应用程序/博客上发表评论。

目前,我可以选择一个表情符号,看到它出现在 textarea 中,提交表单,评论保存在控制器 post 方法中到我的 MySQL 5.7.17 db 表中 - 我可以在表格列中看到表情符号艺术 - 评论通过ajax返回,我可以在页面上看到表情符号。耶,呜呼!

但!重新加载页面后......我看到了这个:

“ð±和ð¶”

是什么赋予了??

为了在 mysql 中插入表情符号,我遵循了这个教程:

https://mathiasbynens.be/notes/mysql-utf8mb4

存储不是问题。

我的 my.cnf 文件,位于

/usr/local/Cellar/mysql/5.7.17/support-files/my.cnf

我的.cnf:

--defaults-extra-file=#
[client]
default-character-set = utf8mb4

[mysqld]
init-connect='SET NAMES utf8mb4'
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

然后进行了以下查询:

ALTER TABLE comments CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

和这个:

mysql> SET NAMES 'utf8mb4';
Query OK, 0 rows affected (0.00 sec) [then I put: init-connect='SET NAMES utf8mb4' in the cnf file]

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR 
Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8               |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8               |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_general_ci |
| collation_database       | utf8_general_ci    |
| collation_server         | utf8_general_ci    |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

^但是,据我了解,这只有效一次^

因为当我在运行应用程序后运行该命令时,它显示:

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

我的 pom.xml 有这个:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF 8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>

    <property name="hibernate.connection.CharSet" value="utf8mb4" />
    <property name="hibernate.connection.characterEncoding" 
    value="utf8mb4"/>
    <property name="hibernate.connection.useUnicode" value="true"/>
</properties>

在所有相关的 HTML 页面和标题片段上,我都有:

<meta charset="UTF-8">

当我在控制器的 PostMapping 方法中使用 System.out.println(comment.getBody()) 时 - 在我保存评论之前和之后 - 我可以在终端中看到表情符号就好了!但是当我在页面的 GetMapping 中 System.out.println(comment.getBody()) 时,我看到所有奇怪的字符而不是表情符号。我真的很困惑。您认为问题可能是什么,我应该怎么做才能解决它?任何帮助表示赞赏,在此先感谢您!

(来自评论:)

CREATE TABLE `comments` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `body` blob NOT NULL, 
    `created_date` datetime DEFAULT NULL, 
    `parent_id` bigint(20) DEFAULT NULL, 
    `post_id` bigint(20) DEFAULT NULL, 
    `user_id` bigint(20) DEFAULT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=2084 DEFAULT CHARSET=utf8 

标签: javamysqlspringthymeleafemoji

解决方案


这看起来像“Mojibake”;请参阅UTF-8 字符的问题;我看到的不是我存储的

但是,由于ð是 hex F0,并且F0是 Emoji (等)的开始,可能是您utf8在 MySQL 中指定而不是utf8mb4. 应该是什么"ð± and ð¶"??

春天/休眠:

休眠 XML:

<property name="hibernate.connection.CharSet">utf8mb4</property>
<property name="hibernate.connection.characterEncoding">utf8</property>
<property name="hibernate.connection.useUnicode">true</property>

连接网址: db.url=jdbc:mysql://localhost:3306/db_nameuseUnicode=true&character_set_server=utf8mb4

创建表

DEFAULT CHARSET=utf8表示 allVARCHARTEXTcolumns 将被覆盖,CHARSET utf8 除非被覆盖

body blob NOT NULL,-- 你甚至没有使用类似文本的数据类型! BLOB说“只需将字节放入;甚至不要考虑CHARSET”。

因为BLOB,如果 Emoji 进入body,则字节的输出方式应该与它们进入的方式相同。但是,让我们检查一下其他内容。请获取HEX(body),最好是一个很短的身体,也许只有一个表情符号。

例如,十六进制代表--

F09F9881 -- correctly in utf8mb4 (aka "UTF-8" outside MySQL).  Note leading F0
C3B0C5B8CB9CC281 -- "Double encoded".  Might display as 😠 Note leading ETH (ð)

推荐阅读