1

我知道这已经被问过很多次了,但我很难理解整理和编码的区别。

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

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

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

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

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

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

谢谢

4

1 回答 1

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_ciutf8_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 不再支持数据库重命名。

于 2012-12-06T16:16:54.203 回答