我可以将MySQL数据库字符集从latin1转换为utf8而不丢失数据吗?
我想将数据库转换为存储unicode符号 目前,这些表格有:我可以将MySQL数据库字符集从latin1转换为utf8而不丢失数据吗?,mysql,django,python-2.7,encoding,utf-8,Mysql,Django,Python 2.7,Encoding,Utf 8,我想将数据库转换为存储unicode符号 目前,这些表格有: 拉丁语瑞典语ci排序规则和拉丁语1字符集 或 utf8\u general\u ci排序规则和utf8字符集 我不确定现有数据是如何编码的,但我假设它是utf-8编码的,因为我使用的是Django,我认为它在发送到数据库之前将数据编码为utf-8 我的问题是: 我是否可以使用以下查询将表转换为utf8\u unicode\u ci排序规则和utf-8字符集,而不会弄乱现有数据?(如帖子所建议) ALTER数据库数据库名称字符集utf8
拉丁语瑞典语ci
排序规则和拉丁语1
字符集
或
utf8\u general\u ci
排序规则和utf8
字符集
我不确定现有数据是如何编码的,但我假设它是utf-8
编码的,因为我使用的是Django,我认为它在发送到数据库之前将数据编码为utf-8
我的问题是:
我是否可以使用以下查询将表转换为utf8\u unicode\u ci
排序规则和utf-8
字符集,而不会弄乱现有数据?(如帖子所建议)
ALTER数据库数据库名称字符集utf8 COLLATE utf8\u unicode\u ci代码>
ALTER TABLE tablename转换为字符集utf8 COLLATE utf8\U unicode\U ci代码>
考虑到latin1是utf-8的子集,我认为它应该工作。你们觉得怎么样
先谢谢你
注意:MySQL的版本是:5.1Latin1不是UTF-8的子集-ASCII是。然而,Latin1是用Unicode表示的
转换为
应该可以工作,只要数据首先以正确的编码存储。Django可能在数据库连接上使用了UTF-8,但数据库应该在运行时重新编码
要检查实际使用的编码,请使用mysql
命令行工具执行SQL查询,选择您知道包含非ASCII字符的行。然后使用mysqlHEX()
函数检查使用的字节。如果您看到大于0x7f的字节,请检查它们是否与中的有效字符相对应。如果c396
位于latin1
列中,并且希望它表示Ö
,则您已经到了“双重编码”的一半。不要使用转换为;这真的会让你陷入“双重编码”
相反,你需要的是
如果你已经把它搞砸了,现在Ö
是十六进制C383E28093
,那么你需要这样做
这将通过两个步骤获得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)
是否希望该列为拉丁文1?或者utf8?last_name='RÖNSCH'HEX(子字符串(last_name,2,1))返回'c396'这是什么意思?从…
选择HEX(last_name),尽管来自Django文档:Django的所有数据库后端都会自动将Unicode字符串转换为与数据库对话所需的适当编码。它们还自动将从数据库检索到的字符串转换为Python Unicode字符串。您甚至不需要告诉Django数据库使用什么编码:这是透明处理的。“选择十六进制(姓氏)from…
返回“52C3964E534348”,其中Ö为c396@mihow你最好问一个新问题。确保包括所有信息,包括复制步骤。我希望所有表格都是utf-8编码的。我有c396
坐在latin1
列中,意思是Ö
。然后我使用ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
(MySQL没有显示错误或警告)。现在,当我对值为的行使用HEX()时,它会再次返回c396
。这意味着我没有进行“双重编码”“,尽管我已经运行了CONVERT TO
。我现在也可以在这个表中存储unicode符号了。看来我做得对。或者没有?我不知道你到底做了什么,但我试过了,得到了十六进制编码C383E28093——双重编码。请显示显示创建表。
CONVERT(BINARY(CONVERT(CONVERT(UNHEX('C383E28093') USING utf8) USING latin1)) USING utf8)