如何检测Oracle中4字节的UTF8字符(How to detect 4byte UTF8 cha

2019-09-27 08:01发布

我们已经看到存储在Oracle 4个字节的UTF-8字符。 我们需要检测多少行有一个特定的列这样的人物。

试图这里给出的建议- UTF-16增补字符 ,但没有为我工作。 它抛出一个错误 - ORA-12728:无效的范围内的正则表达式。 试过其他的答案了。 他们没有工作。

甲骨文记录了可能的十六进制代码范围为UTF-8表B-2在此页中的Unicode字符集 。 我试图检测到行5或表6落在任何字符(“增补字符:其他中国,日文和韩文字符;历史人物,音乐符号,数学符号”或“专用区#2”)

是否有一个正则表达式,我可以用它来检测这样的行?

select count(*) from mytable where regexp_like(mycolumn, expression);

Answer 1:

可能是你做错了什么用正则表达式的建筑:有简短的例子。

-- create table: 
create table tmp_a as 
select unistr('\D841\DF0E') col from dual;
insert into tmp_a(col)
values(UNISTR('\D800\DC00'));
insert into tmp_a(col)
values(UNISTR('\D800\DC01'));
insert into tmp_a(col)
values(UNISTR('\D803\DC03'));
insert into tmp_a(col)
values(UNISTR('\041f'));
insert into tmp_a(col)
values('a');
insert into tmp_a(col)
values('b');


-- then check. There is should be 7 rows and only 4 should pass then "check"
select col, dump(col) , regexp_instr(col, '['||UNISTR('\F090\8080')||'-'||UNISTR('\F48F\BFBF')||']') as check from  tmp_a ;


-- finaly we could build next query with regexp_like as in your example 
select count(*) 
  from tmp_a 
 where regexp_like(col, '['||UNISTR('\F090\8080')||'-'||UNISTR('\F48F\BFBF')||']')

它的工作原理上的Oracle 11.2.0.4和12.2.0.1



Answer 2:

也许更容易寻找替代品。 高代孕是从U+D800 - U+DBFF ,低代理是从U+DC00 - U+DFFF

这其中也应该工作,就是找低位代理:

WHERE REGEXP_LIKE(ASCIISTR(mycolumn), '\\D[C-F]')


文章来源: How to detect 4byte UTF8 characters in Oracle
标签: oracle utf-8