从MSSQL迁移到MySQL的字符编码问题

时间:2015-10-14 10:35:36

标签: mysql encoding

我们在Windows上使用MSSQL运行了一个名为JIRA的应用程序,我需要将其迁移到Linux / MySQL。现有MSSQL数据库中的字符编码是latin1,但我需要在MySQL中使用UTF-8。

我使用应用程序提供的备份机制来获取MSSQL数据的xml转储。通过python过滤器运行它以将编码从latin1转换为UTF-8。这是我的同事提供给我的python代码。

#!/usr/bin/python
import codecs, re

try:
highpoints = re.compile(u'[\U00010000-\U0010ffff]')
except re.error:
highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')

#fin = codecs.open('unicodestuff.txt', encoding='utf-8', errors='replace')
 fin = codecs.open('entities.xml', encoding='latin1')
 fout = codecs.open('stripped.xml', encoding='utf-8', mode='w',       errors='replace')
 for line in fin:
 line = highpoints.sub(u'', line)
 fout.write(line)

fin.close()
fout.close()

我采用过滤后的xml转储并在应用程序中使用“恢复”机制,我恢复数据。然而,在恢复数据后,我发现在MySQL端检查了几条记录,我看到一些奇怪的字符,我假设它们与字符编码有关。例如,

在MSSQL端,文本字符串是

“”借方数量超过最大值0“

“2-Restrict All Credits”

默认ของประเภทบัญชีถูกต้องแต่เลขบัญชีไม่ถูกต้อง

分行:724มาบุญครอง

而在MYSQL方面,相应的文本显示为

â?? ??借方数超过最大值0?

â?? 2-Restrict AllCreditsâ?

默认à¸à¸à¸à¸à¸£à¸°àààààààààààààààààààààààààààààààààààààààààààààààààààààààààà¥àà AAA±à¸à¸à¸μà¹à¸¡à¹à¸à¸¹à¸à¸à¹à¸à¸

分店:724à¸à¸¸à¸à¸¸à¸à¸à£ààààà

您能否提供一些解决这些字符编码问题的建议?如果需要更多信息,请告诉我。

由于 萨姆

1 个答案:

答案 0 :(得分:0)

显然,您的XML文件实际上并不使用Latin-1字符集。您已经显示其中包含“ของประเภทบัญชีถูกต้องแต่เลขบัญชีไม่ถูกต้อง”等文字。 Latin-1字符集符合标签上的内容:它代表拉丁字母表中的字母。那些信件不存在于其中。如果XML文件中的标题声称它是Latin-1,那么这些标题是不真实的,严格来说,XML无效。但它可能仍然有用。

现在的问题是,XML文件实际使用的字符编码是什么?要找出答案,您可能必须以十六进制检查XML文件。主要有三种可能性:(1)它使用的是旧的代码页,如874,其中包含这些字符; (2)它使用UTF-16; (3)它使用的是UTF-8。

如果用十六进制检查XML的一部分,其中包含一些非拉丁文本,以及附近的一些拉丁字母,这就是您可能会看到的内容。如果它位于诸如874的代码页中,则每个拉丁字母将是一个字节,其值为32到7F,并且每个非彩色字母将是一个(或可能是两个?)字节,其值为80到FF。如果它是UTF-16,每个拉丁字母将是两个字节,一个从32到7F,另一个总是00,非明字母将是两个字节,都不是00.如果它是UTF-8,拉丁字母将是从32到7F的一个字节,非明信字母(可能)是三个字节,都是从80到FF。

可能有一种检查十六进制的替代方法。某些文本编辑器程序可以按您选择的编码格式保存文本文件。例如,TextPad 7可以保存为ANSI,DOS,UTF-8,Unicode或Unicode(big-endian)。后两个选项实际上是UTF-16。尝试将XML加载到这样的程序中,并将其副本保存为UTF-8和Unicode。其中一个副本应与原始副本大小相同(加或减两个或三个字节),另一个副本大小不同。无论哪种尺寸匹配都可能是正确的格式。如果两者不同,那么你就会有一些奇怪的东西。

无论如何,如果你将一个版本保存为UTF-8然后能够打开它并看到你的数据完好无损,那么你应该能够在不使用Python翻译器的情况下导入它。