恢复数据后数据类型LVARCHAR损坏

时间:2013-03-25 08:22:08

标签: sql encoding informix sqldatatypes

我遇到以下问题:

我删除了表中的一个键(错误地),然后通过这种方式恢复了整个表:

LOAD FROM 'C:\db\rqrequesttrans.dat' delimiter '~' insert into rqrequesttrans

几乎所有内容都可以,但我在LVARCHAR字段中损坏了数据:

例如:

<p>ääÊãÑå ÈÇäÊæÈ ÈÇääÇÒå.</p>代替<p>للتكرم بالتنبيه باللازم.</p>

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

这不是一个真正的答案;这是一些分析,并要求提供更多信息。

分析

阿拉伯数据在我的浏览器中显示为UTF-8:

0x3C = U+003C
0x70 = U+0070
0x3E = U+003E
0xD9 0x84 = U+0644
0xD9 0x84 = U+0644
0xD8 0xAA = U+062A
0xD9 0x83 = U+0643
0xD8 0xB1 = U+0631
0xD9 0x85 = U+0645
0x20 = U+0020
0xD8 0xA8 = U+0628
0xD8 0xA7 = U+0627
0xD9 0x84 = U+0644
0xD8 0xAA = U+062A
0xD9 0x86 = U+0646
0xD8 0xA8 = U+0628
0xD9 0x8A = U+064A
0xD9 0x87 = U+0647
0x20 = U+0020
0xD8 0xA8 = U+0628
0xD8 0xA7 = U+0627
0xD9 0x84 = U+0644
0xD9 0x84 = U+0644
0xD8 0xA7 = U+0627
0xD8 0xB2 = U+0632
0xD9 0x85 = U+0645
0x2E = U+002E
0x3C = U+003C
0x2F = U+002F
0x70 = U+0070
0x3E = U+003E

其他数据显示为ISO 8859-1(或8859-15)中的UTF8编码字符:

0x3C = U+003C
0x70 = U+0070
0x3E = U+003E
0xC3 0xA4 = U+00E4
0xC3 0xA4 = U+00E4
0xC3 0x8A = U+00CA
0xC3 0xA3 = U+00E3
0xC3 0x91 = U+00D1
0xC3 0xA5 = U+00E5
0x20 = U+0020
0xC3 0x88 = U+00C8
0xC3 0x87 = U+00C7
0xC3 0xA4 = U+00E4
0xC3 0x8A = U+00CA
0xC3 0xA6 = U+00E6
0xC3 0x88 = U+00C8
0x20 = U+0020
0xC3 0x88 = U+00C8
0xC3 0x87 = U+00C7
0xC3 0xA4 = U+00E4
0xC3 0xA4 = U+00E4
0xC3 0x87 = U+00C7
0xC3 0x92 = U+00D2
0xC3 0xA5 = U+00E5
0x2E = U+002E
0x3C = U+003C
0x2F = U+002F
0x70 = U+0070
0x3E = U+003E

我们可以看到<p>.</p>数据很常见,空白U + 0020出现在同一个地方。

对齐数据块,我们可以有一些一致性和不一致性:

0xD9 0x84 = U+0644  :  0xC3 0xA4 = U+00E4   Delta = 0x0560
0xD9 0x84 = U+0644  :  0xC3 0xA4 = U+00E4   Delta = 0x0560
0xD8 0xAA = U+062A  :  0xC3 0x8A = U+00CA   Delta = 0x0560
0xD9 0x83 = U+0643  :  0xC3 0xA3 = U+00E3   Delta = 0x0560
0xD8 0xB1 = U+0631  :  0xC3 0x91 = U+00D1   Delta = 0x0560
0xD9 0x85 = U+0645  :  0xC3 0xA5 = U+00E5   Delta = 0x0560
0x20      = U+0020  :  0x20      = U+0020

0xD8 0xA8 = U+0628  :  0xC3 0x88 = U+00C8   Delta = 0x0560
0xD8 0xA7 = U+0627  :  0xC3 0x87 = U+00C7   Delta = 0x0560
0xD9 0x84 = U+0644  :  0xC3 0xA4 = U+00E4   Delta = 0x0560
0xD8 0xAA = U+062A  :  0xC3 0x8A = U+00CA   Delta = 0x0560
0xD9 0x86 = U+0646  :  0xC3 0xA6 = U+00E6   Delta = 0x0560
0xD8 0xA8 = U+0628  :  0xC3 0x88 = U+00C8   Delta = 0x0560
0xD9 0x8A = U+064A
0xD9 0x87 = U+0647
0x20      = U+0020  :  0x20      = U+0020

0xD8 0xA8 = U+0628  :  0xC3 0x88 = U+00C8   Delta = 0x0560
0xD8 0xA7 = U+0627  :  0xC3 0x87 = U+00C7   Delta = 0x0560
0xD9 0x84 = U+0644  :  0xC3 0xA4 = U+00E4   Delta = 0x0560
0xD9 0x84 = U+0644  :  0xC3 0xA4 = U+00E4   Delta = 0x0560
0xD8 0xA7 = U+0627  :  0xC3 0x87 = U+00C7   Delta = 0x0560
0xD8 0xB2 = U+0632  :  0xC3 0x92 = U+00D2   Delta = 0x0560
0xD9 0x85 = U+0645  :  0xC3 0xA5 = U+00E5   Delta = 0x0560

所以,显然,沿线某处出现了问题。很可能是代码集存在问题。除了字符代码正确且不正确之外,常数0x0560并不重要,这是神奇的数字。

问题

如果没有很多问题的答案,没有人能够给你很多帮助。当然,有一些明显的可能性,一些答案会使一些问题没有实际意义。

  1. 你在哪个平台上运行? (操作系统名称和版本; CPU类型。)给定加载文件名,您很可能运行某些版本的Windows。是Win32还是Win64?哪个版本的Windows?
  2. 您使用的是哪个版本的Informix? (例如,Informix 11.70.FC7W2。)
  3. 您正在使用的数据库的区域设置(DB_LOCALE)是什么? (例如:en_us.8859-1。)
  4. 什么是客户端区域设置(CLIENT_LOCALE)?
  5. 数据文件C:\db\rqrequesttrans.dat是如何创建的?区域设置是否相同?
  6. 该文件中示例数据来自哪个字节?
  7. 您是否在DB-Access或其他地方执行了LOAD命令?如果还有别的什么?
  8. 数据文件有多大?
  9. 桌子的架构是什么?
  10. 表格中有多少行?
  11. LVARCHAR字段中的损坏是否在行之间保持一致?
  12. 您是否可以为包含该表的数据页执行页面转储? (可能是oncheck -pponcheck -pP
  13. 您是否与IBM签订了支持合同?如果是这样,请使用它 - 到目前为止会更快。
  14. 理想情况下,您将在一个小表中演示损坏 - 一个表中包含完整数据列的一小部分列(2列或3列,其中一列是LVARCHAR列),以及少量行(根据10)。我们可能没有那么幸运能够创造它。列出的问题可能是第一个被问到的问题(除了oncheck信息之外)。