【问题标题】:Can someone help me understand why I should or should not convert all my columns from latin1_swedish_ci to utf8_unicode_ci?有人可以帮我理解为什么我应该或不应该将我的所有列从 latin1_swedish_ci 转换为 utf8_unicode_ci 吗?
【发布时间】:2012-11-15 13:47:06
【问题描述】:

我知道这个问题已经被问过很多次了,但我很难理解排序规则和编码的区别。

好的,所以我们有一个 MySQL 数据库(实际上有几个),其中包含混合排序规则的表。现在,有些列是utf8_unicode_ci,有些是默认的latin1_swedish_ci。此后,我们使用utf8_unicode_ci 作为默认值。但是我们在 latin1 中有很多“遗留”列。

我们喜欢一致性,并希望将所有列转换为 utf8。幸运的是,我们 99.9% 的数据是英文的,其中(字面上)有几条记录有西班牙地址(波浪号)。对我们来说非常简单的东西,但我们希望以“正确的方式”做到这一点并完全支持任何语言。因此,utf8_unicode。

我们宁愿不必遍历每个表中的每一列并进行更改。是否有一个简单的脚本可以将每一列转换为utf8_unicode_ci

另外,我们需要寻找哪些陷阱?我的意思是,如果我错了,并且有我不知道的俄语或日语记录,那么我会遇到问题吗?

也许这应该是一个附带问题,但对于编码,UTF8 更好,因为它可以存储任何语言,对吗?例如,每个字符将有 2 或 4 个字节来表示它在数千个字符的“全局”字母表中应该是什么?对不起,如果这个类比听起来很愚蠢但试图理解。排序规则就是我查询时它们的排序方式。因此,如果将字符存储为A8 9F 用于字母HB3 2E 用于字母eH 将首先出现,因为A8B3 之前出现?

哈,我现在头晕。抱歉,如果这似乎是三个不同的问题,但是当我去管理层并说我需要转换列时,这就是为什么....

谢谢

【问题讨论】:

  • 未来 SQL 环境的标准化和兼容性?此外,它将允许使用不同的特殊字符。因此,这取决于您想要适应哪种语言(以及使用哪些特殊字符)。
  • 对。这实际上是我将所有内容都转换为utf8_unicode_ci 的论点。我们的应用程序很小,但如果我们无法正确存储西班牙语或俄语,我会很尴尬。
  • 因此,转换为无法存储特殊字符的排序规则是没有好处的。我建议转换为可以容纳所有内容的版本。话虽这么说,您真的必须转换吗,您可以同时使用两者而不会出错吗?最后,知道了这一点,你还在问同样的问题吗?
  • 嗯,这就是我想要理解的。如果不需要,我不想转换。我想根本问题是,utf 还是不 utf。就是那个问题。 :-) 但是,如果我确实进行了转换,那么什么是一个好的脚本,它不涉及大量的手动转换等。

标签: mysql encoding utf-8 type-conversion latin1


【解决方案1】:

想到的最简单的方法是:

  1. 创建备份数据库create database olddb like dbname
  2. 将所有数据和结构导出到转储:mysqldump dbname > dbname.sql
  3. 将所有内容导入备份:mysql -D olddb < dbname.sql
  4. 只导出表结构:mysqldump --no-data olddb > structure.sql
  5. 使用您选择的文本编辑器打开 structure.sql,并将所有 latin1_swedish_ci 替换为 utf8_unicode_ci
  6. 删除您的数据库:drop database dbname 以轻松清除所有表。
  7. 使用 utf8 重新创建数据库:create schema dbname default character set utf8 collate utf8_swedish_ci
  8. 将更改后的结构导入新数据库:mysql -D dbname < structure.sql。此时,您应该在 olddb 中拥有整个旧数据库,并在 dbname 中拥有一个完全为 utf8 的空数据库。
  9. 为数据库中的每个表使用insert into dbname.tbl select * from olddb.tbl。如果有很多表,您可以通过导出 show tables from olddb 的输出并在其周围添加插入 sql 来生成一个 sql 脚本来执行此操作。
  10. 检查结果,如果您满意,drop database olddb

这个过程可能会短一些,不幸的是 MySQL 不再支持数据库重命名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2015-07-28
    • 2019-11-09
    • 2013-12-02
    • 1970-01-01
    • 2022-12-03
    • 2012-05-16
    相关资源
    最近更新 更多