【问题标题】:Does characterEncoding in connection string set how values is stored?连接字符串中的字符编码是否设置值的存储方式?
【发布时间】: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


【解决方案1】:

那是Ώπα?这就是UTF-8(外界称之为)、utf8mb4(MySQL 的等价物)或utf8(MySQL 对 UTF-8 的部分实现)的解释。

它在latin1 中无法正常工作。

客户端中的编码和数据库中列的编码不必相同。但是,客户端中的希腊语不能塞进表格中的 latin1 中,因此会出现错误消息。

ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 所做的是将表中的所有文本列更改为 utf8 编码并从当前使用的任何编码(可能是 latin1)转换。这对于西欧字符来说很好,所有这些字符都存在于 latin1 和 utf8 中(具有不同的编码)。

要处理Emoji和一些中文,你不妨去utf8mb4:

ALTER TABLE table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8_unicode_520_ci;

【讨论】:

  • 谢谢!尝试在转换之前写入所有可能的字符,并且可以在不损坏数据的情况下成功转换
猜你喜欢
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多