2014-12-03 44 views
0

我目前需要编写一个SQL查询来确定我的UTF8 Oracle数据库中与另一个使用LATIN-1的系统不兼容的行数。如何确定Oracle数据库字段中的字符是否在UTF8字符集内,但是在带有SQL的LATN-1之外?

例如,Über不应返回结果,但翻译应该

我试图查询,如:

select decode(convert(convert('Über test', 'WE8ISO8859P1'), 'UTF8'), convert('Über test', 'UTF8'), 1, 0) from dual; 

然而,这并没有给我,我需要的结果。任何人都可以为这个问题提供一个只有SQL的解决方案吗谢谢

回答

0

我想我已经计算出来:

select * from (select asciistr(convert('test string goes here', 'UTF8')) as str from dual) where regexp_like(str, '.*\\([1-9A-F]|0[1-9A-F]).*');

使用http://en.wikipedia.org/wiki/Latin-1_Supplement_%28Unicode_block%29作为参考,的unicode的LATIN-1块在\ 00FF结束。

例如,

SQL> select * from (select asciistr(convert('翻译', 'UTF8')) as str from dual) where regexp_like(str, '.*\\([1-9A-F]|0[1-9A-F]).*'); 

STR 
------------------------------ 
\7FFB\8BD1 

如果有人可以从逻辑的角度仔细检查这一点,我将不胜感激。

1

你没有提及Oracle版本。达到11.2,您应该使用Oracle提供的字符集扫描程序(CSSCAN)来达到此目的。从12.1开始,有一个名为Oracle数据库迁移助理的新工具,用于Unicode。

+1

感谢您的建议,我会研究这些 - 很遗憾,我无法在此数据库上运行任何实用程序。我必须通过标准的SQL查询来执行。 – dave 2014-12-03 19:27:47

相关问题