我想将我的数据库转换为存储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
答案 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?