有一个MySQL备份文件,这是一个巨大的文件-大约3gb。有一个表具有一个LONGBLOB列,用于存储JPEG图像数据。
如果从MySQL工作台-数据导入/恢复,文件导入成功。
我需要打开这个文件并提取前几行(大约两行插入表的图像数据),以便我可以测试是否另一个程序可以将这些数据导入到另一个MySQL数据库。
我试着用EmEditor打开文件(它擅长打开大文件),然后只复制/粘贴一个脚本的Insert语句到一个新文件中(最多25行,因为有问题的表是备份脚本中的第一个表),然后将选择粘贴到一个新文件中。
问题来了:
然而,这混淆了编码(即使我保存为utf8)。当我尝试将这个新文件(再次使用MySQL Workbench)导入(恢复)到MySQL数据库中时,我意识到这一点,恢复继续进行,没有错误,但是blob列中的JPEG图像现在被破坏/损坏了。
我的猜测是原始文件和新文件之间的编码不同。
EmEditor不显示原始文件上的编码,有一个要检测的选项,它将其检测为'UTF8 Unsigned'。但在保存时,我将其保存为UTF8。我也试过保存为ANSI, ISO8859 (windows默认)等。但每次都是相同的结果。
对于这个特殊的问题,你有什么解决办法吗?我想只削减前几行庞大的备份文件,并保存到一个新的文件保持编码相同,使图像(blobs)不改变。是否有任何方法可以用EmEditor完成(即我有错误的方法[即剪切粘贴]?)有没有专门的软件可以做到这一点?我怎样才能诊断出哪里出了问题呢?感谢您的回复
对于任意二进制数据,这会使编码混乱(即使我保存为utf8)
UTF-8不是一个好的选择。有许多高字节序列在UTF-8中是无效的,因此在加载-更改-保存过程中的某个时刻,您将对它们进行混淆。
如果您使用将每个字节映射到唯一字符的编码加载文件,并使用相同的编码重新保存文件,则应该保留原始内容(*)。ISO-8859-1是为此目的通常选择的编码,因为它简单地将每个字节映射为0。0xFF到具有相同数字的Unicode码点。
(*:假设编辑器对于其他棘手的点(如null, n
/r
和其他控制字符)是二进制安全的…我相信EmEditor可以。
在EmEditor中打开原始文件时,尝试选择编码为二进制(ASCII视图)。正如bobince所说,二进制(ASCII视图)将把每个字节映射到一个唯一的字符,并在保存文件时保留该字符。我想这应该能解决你的问题。