字符在MySQL中显示为问号

时间:2016-12-08 16:12:35

标签: mysql unicode utf8mb4

我在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操作:无法执行JDBC批量更新;未分类SQL的SQLException ...字符串值不正确:'\ xD0 \ xBA \ xD1 \ x81 \ xD0 \ xB5 ......'对于第1行“

”列'first_name'

查询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/

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

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

我知道很多时候这个问题得到了解答,但我尝试了在谷歌找到的所有内容,但仍无法解决问题。任何帮助表示赞赏!

更新

在查询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更改列后,我在保存值时消除了错误,但它返回到保存带有问号的字符串。还没有找到问题

4 个答案:

答案 0 :(得分:5)

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

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

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

第1步:将以下行添加到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>

问题解决了。

答案 1 :(得分:1)

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

    ?useUnicode=yes&characterEncoding=UTF-8
    

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

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

    < / li>

答案 2 :(得分:1)

在我的例子中,用问号替换西里尔字母的问题很容易解决,方法是删除表并重新创建它,并在“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 上提供了有关编码问题的更多详细信息。

答案 3 :(得分:0)

打开my.conf文件并添加:

[mysql]
default-character-set=utf8

到文件的末尾。

请记住重新启动sqld服务以反映更改。