【问题标题】:Characters appear as question marks in MySQL字符在 MySQL 中显示为问号
【发布时间】:2017-04-23 23:00:10
【问题描述】:

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

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

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

并执行查询:

ALTER DATABASE <my_database> CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci

重启mysql后报错:

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

查询mysql&gt; 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/

查询mysql&gt; show create database &lt;my_database&gt; 给出:

| Database  | Create Database                                                       |
+-----------+-----------------------------------------------------------------------+
| my_database | CREATE DATABASE `my_database` /*!40100 DEFAULT CHARACTER SET utf8mb4 */

我知道这个问题已经回答了很多次,但我尝试了我在 google 中找到的所有内容,但仍然无法解决。任何帮助表示赞赏!

更新

查询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 更改列后,我在保存值时摆脱了错误,但它又回到用问号保存字符串。还没发现问题

【问题讨论】:

  • 您是否更改了 Java 应用程序中的 连接编码(或任何产生该错误的因素)...!?
  • @deceze 我在 jdbc:mysql URL 中有“useUnicode=true&characterEncoding=utf-8”,这是你的意思吗?
  • 请提供SHOW CREATE TABLE必须是utf8mb4。
  • 谢谢@RickJames,只需使用该信息在原始帖子中添加更新
  • 更多讨论here.

标签: mysql unicode utf8mb4


【解决方案1】:

所以 2 天后,我能够在评论和其他帖子的帮助下弄明白。

unicode 的问题存在于 2 个层面: 1)它是如何保存在MySql中的 2) Freemarker 是如何显示价值的

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

STEP1:将以下行添加到 my.cnf 文件:

character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

第 2 步: 运行查询

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

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

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

<beanclass="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="contentType" value="text/html;charset=UTF-8"/>
    </bean>

问题解决了。

【讨论】:

    【解决方案2】:
    1. 确保在插入数据库时​​使用正确的编码。将以下内容添加到您的 jdbc URL

      ?useUnicode=yes&characterEncoding=UTF-8
      

      所以您的最终到达网址将如下所示

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

    【讨论】:

    • 这在我的情况下有效。我不得不使用utf8_general_ci 将一些列迁移到utf8。还要记住,客户端机器有自己的排序规则。例如,就我而言,对于一个相关问题,对于 Java 应用程序,我必须设置这些标志 -Dfile.encoding="UTF-8" -Dsun.jnu.encoding="UTF-8"。输入和输出流存在问题,这两个解决方案解决了它。
    【解决方案3】:

    在我的例子中,用问号替换 cyrillyc 字母的问题很容易解决,方法是删除表并再次创建它,并在“CREATE TABLE”语句的末尾添加以下内容:

    DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
    

    例如:

    CREATE TABLE IF NOT EXISTS People (id int NOT NULL AUTO_INCREMENT, name varchar(50), gender char(1), birthDate date, profession varchar(50), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
    

    official MySQL website 上提供了有关编码问题的更多详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-07
      • 2021-12-28
      • 1970-01-01
      • 2013-11-21
      • 2015-10-27
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多