【发布时间】:2019-05-09 14:42:57
【问题描述】:
我即将将数据库的编码从 latin1 更改为 utf8mb4。 由于隐私限制,我不知道要转换的数据库包含什么。我担心通过在 SQL 下运行,可能会更改现有数据。
ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
但是,来自 grails 应用程序的连接字符串包含 useUnicode=true&characterEncoding=UTF-8,这是否意味着即使 latin1_swedish_ci 用于列,但实际保存的值是 UTF -8 编码?
而且由于这个值是 UTF-8 编码的,所以数据不会受到从 latin1 到 utf8mb4 变化的影响吗?
+--------------------------+-------------------+
| Variable_name | Value |
+--------------------------+-------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+--------------------------+-------------------+```
【问题讨论】:
-
"这是否意味着即使 latin1_swedish_ci 用于列,但实际保存的值是 UTF-8 编码的?" - 不。有很多 SO 问题询问为什么当列字符集为 latin1(或类似)时,
Ώπα之类的值会以???的形式存储在数据库中。连接字符串参数告诉服务器正在发送的字符串是 Unicode(编码为 UTF-8),但 latin1 字符集不包含这些字符,因此在写入列时会将它们转换为问号。 -
感谢您的回答。尝试插入 latin1 不支持的字符时,通过应用程序界面,应用程序返回错误消息 "Incorrect string value: '\xCE\x8F\xCF\x80\xCE\xB1" 。这让我更加确定 latin1 不支持的字符永远不会以问号形式出现在数据库中。这会改变您正在回答的问题的答案吗?
-
要点是一样的:如果一列被定义为 latin1,那么它将只包含 latin1 编码的字符串。将列从 latin1 转换为 utf8mb4 可能会更改字符串的 编码,但不会更改其值,例如,即使 'é' 编码不同,'André' 仍将保持 'André'。
标签: mysql grails jdbc character-encoding