我可以恢复错误存储在 varchar 字段中的国际字符吗?
Posted
技术标签:
【中文标题】我可以恢复错误存储在 varchar 字段中的国际字符吗?【英文标题】:Can I recover international characters mistakenly stored in a varchar field? 【发布时间】:2010-09-19 12:05:35 【问题描述】:我的客户有一个旧的 MS SQL 2000 数据库,它使用 varchar(50) 字段来存储名称。他试图使用这个数据库来捕获一些数据(通过网络表单)。一些表单填写者来自其他国家,当这些人中的一些人输入他们的名字时,varchar 字段变得疯狂。是否有可能以某种方式恢复数据?也许通过根据它在 ASCII/varchar 中解析的内容以及该人来自的国家/地区来猜测该字符应该是什么?部分数据:
姓名/国家/地区/名字或姓氏? Jiřà / CZE / F Torbjörn / FIN / F Huszár / HUN / L Jürgen / DEU / F Müller / CHE / L Bumbálková / CZE / L Doležal / CZE / L Loïc / DEU / L
顺便说一下,web 表单指定了这个内容类型:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
【问题讨论】:
【参考方案1】:从第 5 个例子开始。
à 是 ascii #195 (C3)。 ¼ 是 ascii #188 (BC)。
我猜想穆勒就是穆勒。
如果这是 UTF-8,则基于 http://en.wikipedia.org/wiki/UTF-8#Description
我们有 C3 BC = 1100 0011 1011 1100
应用 UTF-8 映射:
(110) 00011 (10) 11 1100
0000 0000 1111 1100
00FC 是 Unicode ü
U+00FC(见http://en.wikipedia.org/wiki/Latin_characters_in_Unicode)
在我看来,您可以通过编程方式解决此问题。
现在解决第一个例子:
Jiå™ã 实际上是 JiÅ™Ã(最后一个字符未显示)。
忽略忌,是对的,
C5 99 c3 AD
(110)0 0101 (10)01 1001 (110)0 0011 (10)10 1101
0159 00ED
里
所以名字是:Jiří。***说特殊的 r 是捷克语,i 也是。此外,如果我用谷歌搜索 Jiří (http://www.google.com/search?q=Ji%C5%99%C3%AD&ie=utf-8&oe=utf-8),我会得到很多点击。我们在这里赢了。
第二个例子,Torbjörn,很好地映射到 Torbjörn,这听起来很有说服力。
恕我直言,不需要人工检查这些,它们似乎只是工作。
【讨论】:
关于“Jiå™ã”:实际名称将粘贴在下面。出于某种原因,As 变成了小写字母(它们最初是大写字母)并且最后一个字符被截断。吉奥™ 谢谢。我现在已经更新了解决方案。我刚刚开始掌握unicode。现在,回去工作:) 是的,utf-8。将该信息添加到问题中。【参考方案2】:俄罗斯邮局做到了。有人在图片消失之前保存了吗?
http://forums.thedailywtf.com/forums/p/7156/133456.aspx
【讨论】:
【参考方案3】:你基本上需要通过libiconv戳它,将它转换为UTF8。
适当字符集的完整列表将取决于您的应用程序,但您可以根据国家代码进行一些猜测。从this page on WikiPedia 开始。
警告:您需要人工来验证每个转换。
【讨论】:
【参考方案4】:关于 Richard 的 cmets:如果包含表单的网页指定了字符集(例如 iso-8859-1 == unicode)和编码(例如 utf-8),那么符合标准的浏览器应该使用该字符集提交表单数据字符集和编码。如果您的网页指定了 unicode,那么您不必处理数据中的随机 Microsoft 代码页 - 它应该都是 unicode。
【讨论】:
以上是关于我可以恢复错误存储在 varchar 字段中的国际字符吗?的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2012 中的最大行大小与 varchar(max) 字段
MySQL: 23 VARCHAR可变长度字段在磁盘上的存储机制