emoji在ajax之后以mysql表列和html呈现,但在重新加载页面之后不呈现为什么?

eqqqjvef  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(333)

我已经在spring&thymeleaf的web应用/博客上实现了一个表情符号选取器。
目前,我可以选择一个emoji,看到它出现在textarea中,提交表单,注解保存在controller post方法中到我的mysql 5.7.17 db表中-我可以在表列中看到emoji艺术-注解通过ajax返回,我可以在页面上看到emoji。耶,呜呼!
但是!重新加载页面后。。。我看到了:
"ð± 以及ð¶"
什么给??
为了在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())——在保存注解之前和之后——我可以很好地看到终端中的emojis!但是当我在页面的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
izj3ouym

izj3ouym1#

看起来像“莫吉巴克”;用utf-8字符查看故障;我看到的不是我储存的
但是,自从 ð 是十六进制 F0 ,和 F0 是emoji(etc)的开头,可能是您指定的 utf8 在mysql中而不是 utf8mb4 . 那是什么 "ð± and ð¶" 应该是??
Spring /冬眠:
休眠xml:

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

连接url: 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 (ð)

相关问题