Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以将MySQL数据库字符集从latin1转换为utf8而不丢失数据吗?_Mysql_Django_Python 2.7_Encoding_Utf 8 - Fatal编程技术网

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

我可以将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

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

目前,这些表格有:

拉丁语瑞典语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.1

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

转换为
应该可以工作,只要数据首先以正确的编码存储。Django可能在数据库连接上使用了UTF-8,但数据库应该在运行时重新编码


要检查实际使用的编码,请使用
mysql
命令行工具执行SQL查询,选择您知道包含非ASCII字符的行。然后使用mysql
HEX()
函数检查使用的字节。如果您看到大于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)