有人可以帮助我理解为什么我应该或不应该将我的所有列从latin1_swedish_ci转换为utf8_unicode_ci?

时间:2012-11-15 13:47:06

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

我知道这已被多次询问,但我很难理解整理和编码的差异。

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

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

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

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

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

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

由于

1 个答案:

答案 0 :(得分: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. 重新创建数据库
  9. 将修改后的结构导入新数据库:mysql -D dbname < structure.sql。此时,您应该在olddb中拥有整个旧数据库,并在dbname中拥有一个空的完全utf8数据库。
  10. 对于数据库中的每个表,使用insert into dbname.tbl select * from olddb.tbl。如果有很多表,你可以通过导出show tables from olddb的输出并在其周围添加插入sqls来生成一个sql脚本来执行此操作。
  11. 检查结果,如果您满意,drop database olddb
  12. 此过程可能会短一些,遗憾的是MySQL不再支持数据库重命名。