我在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
更改列后,我在保存值时消除了错误,但它返回到保存带有问号的字符串。还没有找到问题
答案 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)
确保在插入数据库时具有正确的编码。将以下内容添加到您的jdbc URL
?useUnicode=yes&characterEncoding=UTF-8
因此您的最终到达网址将如下所示
jdbc:mysql://HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8
确保使用 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服务以反映更改。