我已经实现了一个表情符号选择器,用于在我的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 (ð)