我们已经看到存储在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);
可能是你做错了什么用正则表达式的建筑:有简短的例子。
-- 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
也许更容易寻找替代品。 高代孕是从U+D800
- U+DBFF
,低代理是从U+DC00
- U+DFFF
。
这其中也应该工作,就是找低位代理:
WHERE REGEXP_LIKE(ASCIISTR(mycolumn), '\\D[C-F]')