我知道这已被多次询问,但我很难理解整理和编码的差异。
好的,所以我们有一个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}}之前?
由于
答案 0 :(得分:1)
最简单的想法是:
create database olddb like dbname
; mysqldump dbname > dbname.sql
mysql -D olddb < dbname.sql
mysqldump --no-data olddb > structure.sql
latin1_swedish_ci
替换为utf8_unicode_ci
drop database dbname
以便轻松清除所有表格。create schema dbname default character set utf8 collate utf8_swedish_ci
mysql -D dbname < structure.sql
。此时,您应该在olddb中拥有整个旧数据库,并在dbname中拥有一个空的完全utf8数据库。insert into dbname.tbl select * from olddb.tbl
。如果有很多表,你可以通过导出show tables from olddb
的输出并在其周围添加插入sqls来生成一个sql脚本来执行此操作。drop database olddb
此过程可能会短一些,遗憾的是MySQL不再支持数据库重命名。