2016-02-12 67 views
0

我想将我的数据库转换为存储unicode符号。我可以将MySQL数据库字符集从latin1转换为utf8而不丢失数据吗?

目前的表有:

latin_swedish_ci整理和latin1字符集

OR

utf8_general_ci整理和utf8字符集

我不知道现有的数据是如何编码的,但我想这是utf-8编码,因为我使用Django,我觉得发送到数据库之前编码在utf-8数据。

我的问题是: 我可以将表转换为utf8_unicode_ci整理和使用下面的查询不会弄乱现有的数据集utf-8性格吗? (如sugested在this后)

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

考虑latin1的是UTF-8的子集,我觉得它要高度重视的工作。你们有什么感想?

预先感谢您。

P.S:MySQL版本是:5.1

回答

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

+0

last_name ='RÖNSCH' HEX(substring(last_name,2,1))返回'c396' 这是什么意思? –

+0

'选择从十六进制(姓氏)...' –

+0

虽然从Django文档: “所有Django的后端数据库的自动转换Unicode字符串到相应的编码谈话的数据库,还自动转换从数据库中检索字符串。到Python的Unicode字符串,甚至不需要告诉Django什么编码你的数据库使用:这是透明处理的。“ –

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

这让你在2步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?

+0

我希望所有的表都是utf-8编码的。我有'c396'坐在'latin1'栏里,意思是'Ö'。然后我用 'ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;' (没有错误或由'MySQL'显示的警告)。 现在,当我在值为'Ö'的行上使用HEX()时,它会再次返回'c396'。 –

+0

这意味着我没有做“双重编码”,尽管我已经运行了“CONVERT TO”。此外,我现在可以在此表中存储unicode符号。看来我做对了。或没有? –

+0

我不知道你做了什么,但我试了一下,得到了十六进制'C383E28093' - 双重编码。请让我看看SHOW CREATE TABLE。 –

相关问题