【发布时间】: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> 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 */
我知道这个问题已经回答了很多次,但我尝试了我在 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.