Как обнаружить 4-байтовые символы UTF8 в Oracle - PullRequest
0 голосов
/ 24 мая 2018

Мы видели 4-байтовые символы UTF-8, хранящиеся в Oracle.Нам нужно определить, сколько строк имеют такие символы в определенном столбце.

Попробовал приведенную здесь рекомендацию - Дополнительные символы UTF-16 , но у меня это не сработало.Выдает ошибку - ORA-12728: недопустимый диапазон в регулярном выражении.Пробовал и другие ответы тоже.Ни один из них не работает.

Oracle задокументировал возможные диапазоны шестнадцатеричного кода для UTF-8 в таблице B-2 на этой странице Набор символов Unicode .Я пытаюсь обнаружить любой символ, который находится в строках 5 или 6 этой таблицы («Дополнительные символы: дополнительные символы китайского, японского и корейского языков; исторические символы; музыкальные символы; математические символы» ИЛИ «Область личного пользования № 2»)

Можно ли использовать регулярное выражение для обнаружения таких строк?

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

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Может быть, проще искать суррогаты.Высокий суррогат от U+D800 - U+DBFF, низкий суррогат от U+DC00 - U+DFFF.

Этот также должен работать, ищет низкий суррогат:

WHERE REGEXP_LIKE(ASCIISTR(mycolumn), '\\D[C-F]')
0 голосов
/ 24 мая 2018

Может быть, вы что-то не так сделали с построением регулярных выражений: есть короткий пример.

-- 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...