表情符号在 ajax 之后在 MySQL 表列和 HTML 中呈现,但在页面重新加载后不会呈现.为什么?



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

目前,我可以选择一个表情符号,看到它出现在文本区域中,提交表单,注释保存在控制器 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

我的网:

--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)

我的绒球.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 

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

但是,由于ð是十六进制F0,并且F0是表情符号(等(的开头,因此可能是您在MySQL中指定了utf8而不是utf8mb4"ð± and ð¶"应该是什么??

春季/休眠:

Hibernate 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说,除非被覆盖,否则所有VARCHAR列和TEXT列都将被CHARSET utf8

body blob NOT NULL,-- 您甚至没有使用类似文本的数据类型!BLOB说:"只要把字节扔进去;甚至不要考虑CHARSET"。

由于BLOB,如果表情符号进入body,字节应该与它们进入的方式相同。 但是,让我们检查一下其他东西。 请得到HEX(body),最好是很短的身体,也许里面只有表情符号。

例如,😁的十六进制 --

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

最新更新