【问题标题】:Are there any downside effects when changing mysql table encoding?更改 mysql 表编码时是否有任何不利影响?
【发布时间】:2016-11-11 03:34:58
【问题描述】:

我有一个用latin1 编码的表格并整理latin1_bin

在我的表中有一个类型为“TEXT”的列comments,正如您所知,该列继承了表的编码和排序规则,但从现在开始我应该将其更改为utf8utf8_general_ci,因为我' m 开始在comments 中存储特殊字符。

如果我使用如下命令,会不会造成负面影响?

alter table notebooks modify comments text CHARACTER SET utf8 COLLATE utf8_general_ci;

感谢您的回答。

【问题讨论】:

  • 是的,您可以设置每个字段的排序规则。您在表上设置的内容将成为任何没有明确设置的字段的默认值。但你可能最好还是转换整个表格,并将所有内容保存在一个字符集中。
  • 我完全同意@MarcB。对数据库进行本地备份,转换编码并检查数据。您可以按照这些说明进行操作 -> stackoverflow.com/questions/6115612/…
  • 顺便问一下,它会减慢我的查询速度吗?

标签: mysql encoding character-encoding special-characters


【解决方案1】:

危险我认为那个ALTER会破坏现有的文本。

另外,...你的“名字”看起来像中文,所以我猜你想存储中文字符?在这种情况下,您应该使用utf8mb4,而不仅仅是utf8。这是因为有些汉字占 4 个字节(并且不在 Unicode BMP 中)。

我相信您需要 2 个步骤

ALTER TABLE notebooks MODIFY comments BLOB;
ALTER TABLE notebooks MODIFY comments TEXT
          CHARACTER SET utf8mb4  COLLATE utf8mb4_general_520_ci;

否则 latin1 字符 将被“转换”为 ut8。但是如果你的专栏里真的有中文,你就没有latin1。上面的两步更改确实 (1) 关闭了任何字符集知识,并且 (2) 确定字节确实是 utf8mb4 编码的。

为了更安全,先做

RENAME TABLE notebooks TO old;
CREATE TABLE notebooks LIKE old;
INSERT INTO notebooks SELECT * FROM old;

然后执行两个 ALTER 并测试结果。有问题可以RENAME找回旧版。

【讨论】:

  • 感谢您的回答。实际上,我存储法语重音字符,例如 éèùçà ...所以 utf8 在我的情况下效果很好。我处于危险之中,但幸运的是,在进行 ALTER 之后,现有文本没有被破坏。(我不知道为什么???)感谢您提供 utf8mb4 信息。知道这一点很有趣。
  • 唉,我仍然无法预测这方面的一切。我很高兴单个改动没有破坏您的数据。
【解决方案2】:

指定任何不涉及 NATIVE 字符集的直接整数比较的排序序列都会减慢您的查询速度。它是否会显着减慢速度是另一个问题。查看这个和那个的排名,在一个表中比较两个结果,比从数据库中检索磁盘上的信息要快得多,你不会想象吗?

【讨论】:

  • 您能否提供一个示例查询来更好地解释概念?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多