我最近遇到了几个值,这些值在我们的应用程序中导致异常。对数据库的调查表明,我们可能导入了错误的数据(不能修改!(。我们现在发现这个错误的原因在于unicode问题。
为了找到所有相关的错误记录,我转储了我已经识别的值(手动(,并且可以看到,有问题的值位于值96之上,示例如下:
Typ=96 Len=10: 83,85,49,89,36,73,219,190,159,87
而219190159是有问题的。这可以通过select dump(col) from table
获得,但我想进一步只选择转储中的一个值超过99的记录——很像(伪代码(length(string(value)) for value in dump_record > 96
有什么方法可以做到这一点吗?谢谢各位。
这就是我理解这个问题的方式。看看它是否有帮助;遵循代码中的注释:
SQL> with
2 data (col) as
3 -- sample data:
4 -- 123LITTlefOOT results in Typ=96 Len=13: 49,50,51,76,73,84,84,108,101,102,79,79,84
5 -- where marked values are > 96 --- --- ---
6 --
7 -- BIG997FOOT results in Typ=96 Len=10: 66,73,71,57,57,55,70,79,79,84 which is OK
8 (select '123LITTlefOOT' from dual union all
9 select 'BIG997FOOT' from dual
10 ),
11 test as
12 -- DUMP of sample data
13 (select col,
14 dump(col) dmp
15 from data
16 ),
17 -- remove TYP=XX Len=yy
18 test2 as
19 (select col,
20 dmp,
21 trim(substr(dmp, instr(dmp, ':') + 1)) tdmp
22 from test
23 ),
24 -- split TDMP into rows
25 trows as
26 (select col,
27 dmp,
28 regexp_substr(tdmp, '[^,]+', 1, column_value) str
29 from test2 cross join table(cast(multiset(select level from dual
30 connect by level <= regexp_count(tdmp, ',') + 1
31 ) as sys.odcinumberlist))
32 )
33 select distinct col, dmp
34 from trows
35 where to_number(str) > 96;
COL DMP
------------- ------------------------------------------------------------
123LITTlefOOT Typ=1 Len=13: 49,50,51,76,73,84,84,108,101,102,79,79,84
SQL>
Regex完全做到了,我使用了以下简单的解决方案:
SELECT t.* FROM table t WHERE regexp_like(dump(t.error_col), 'd{3}');
感谢您的快速回复!