字符在MySQL中显示为问号

yin*_*jia 5 mysql unicode utf8mb4

我在MySql中保存unicode字符时遇到问题.

最初我的数据库字符集设置为latin1,unicode字符串保存为引号.在做了一些研究后,我添加了以下几行my.cnf:

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
Run Code Online (Sandbox Code Playgroud)

并执行查询:

ALTER DATABASE <my_database> CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
Run Code Online (Sandbox Code Playgroud)

重启mysql后,出现错误:

"org.springframework.jdbc.UncategorizedSQLException:Hibernate操作:无法执行JDBC批量更新;未分类的SQL的SQLException ...不正确的字符串值:'\ xD0\xBA\xD1\x81\xD0\xB5 ...'用于列' first_name'在第1行"

查询mysql> show variables like 'char%'; 返回结果:

Variable_name              | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/
Run Code Online (Sandbox Code Playgroud)

和查询mysql> show create database <my_database>给出:

| Database  | Create Database                                                       |
+-----------+-----------------------------------------------------------------------+
| my_database | CREATE DATABASE `my_database` /*!40100 DEFAULT CHARACTER SET utf8mb4 */
Run Code Online (Sandbox Code Playgroud)

我知道这个问题很多时候都得到了回答,但是我尝试了在谷歌找到的所有东西,但仍无法修复它.任何帮助表示赞赏!

UPDATE

在查询SHOW CREATE TABLE之后,我看到表的DEFAULT CHARSET是latin1.

我改变了表ALTER TABLE my_table CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

之后,每列都将CHARACTER SET设置为latin1,而查询结果末尾的DEFAULT CHARSET为utf8mb4

更改列后ALTER TABLE my_table MODIFY my_column VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,我在保存值时消除了错误,但它返回保存带有问号的字符串.还是没有发现问题

DeC*_*DeR 8

  1. 确保在插入数据库时​​具有正确的编码。将以下内容添加到您的 jdbc URL

    ?useUnicode=yes&characterEncoding=UTF-8
    
    Run Code Online (Sandbox Code Playgroud)

    所以你的最终 URL 看起来像这样

    jdbc:mysql://HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8
    
    Run Code Online (Sandbox Code Playgroud)
  2. 确保使用utf8 字符集和适当的排序规则(如utf8_general_ci)创建表


yin*_*jia 5

所以2天后我在评论和其他帖子的帮助下弄清楚了.

unicode的问题分为2个级别:1)如何在MySql中保存2)Freemarker如何显示值

这些是我解决问题的步骤:

第1步:将以下行添加到my.cnf文件中:

character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
Run Code Online (Sandbox Code Playgroud)

第2步:运行查询

ALTER TABLE my_table MODIFY my_column VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL

对于需要接受utf-8的每一列.修复了MySql编码.注意:更改整个数据库或表似乎不起作用.

第3步:将以下属性添加到ContentNegotiatingViewResolverbean:

<beanclass="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="contentType" value="text/html;charset=UTF-8"/>
    </bean>
Run Code Online (Sandbox Code Playgroud)

问题解决了.