我可以将MySQL数据库字符集从latin1转换为utf8而不会丢失数据吗?

时间:2016-02-12 12:25:22

标签: mysql django python-2.7 encoding utf-8

我想将我的数据库转换为存储unicode符号。

目前表格包含:

latin_swedish_ci 整理和 latin1 字符集

OR

utf8_general_ci 整理和 utf8 字符集

我不确定现有数据是如何编码的,但我认为它是 utf-8 编码的,因为我使用的是Django,我认为它编码 {{中的数据发送到数据库之前1}}

我的问题是: 我是否可以使用以下查询将表格转换为 utf-8 排序规则和 utf8_unicode_ci 字符集,而不会弄乱现有数据? (在this帖子中消化)

utf-8

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

考虑到latin1是utf-8的子集,我认为它可行。你们觉得怎么样?

提前谢谢。

P.S:MySQL的版本是:5.1

2 个答案:

答案 0 :(得分:0)

Latin1不是UTF-8的子集 - ASCII是。但是,Latin1用Unicode表示。

CONVERT TO应该有效,只要数据首先以正确的编码存储即可。 Django可能在数据库连接上使用了UTF-8,但数据库应该在运行中重新编码。

检查实际使用的编码 - 使用mysql命令行工具执行SQL查询,选择您知道包含非ASCII字符的行。然后使用mysql HEX()函数检查使用的字节数。如果您看到大于>的字节数0x7f,请检查它们是否与https://en.wikipedia.org/wiki/ISO/IEC_8859-1#Codepage_layout

中的有效字符相对应

答案 1 :(得分:0)

如果c396列中有latin1,并且您希望它代表Ö,那么您就是“双重编码”的一半。 使用CONVERT TO;这将真正让你进入“双重编码”。

相反,您需要2-step ALTER

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;

如果您已经进一步搞砸了,现在Ö是十六进制C383E28093,那么您需要fix double encoding

这将分两步获取latin1字节:

CONVERT(CONVERT(UNHEX('C383E28093') USING utf8) USING latin1) --> 'Ö' (C396)
HEX(CONVERT(CONVERT(UNHEX('C396') USING utf8) USING latin1)) --> 'Ö' in latin1 (D6)

这可以获得2字节的utf8编码:

CONVERT(BINARY(CONVERT(CONVERT(UNHEX('C383E28093') USING utf8) USING latin1)) USING utf8)

您希望该列是latin1吗?还是utf8?