Я сделал несколько исследований для этого вопроса. chr (0) - вещь, которая повсюду вызывает хаос.
Сначала я создал таблицу, вставил в нее строку с chr (0) и попытался найти ее с помощью regexp_like.
CREATE TABLE t1(col1 VARCHAR2(10));
INSERT INTO t1 VALUES('' || chr(0) || '5678');
SELECT CASE WHEN REGEXP_LIKE(col1,CHR(0)) THEN 1 ELSE 0 END op,col1, dump(col1) FROM t1;
Выход был ниже -
op col1 dump(col1)
---- ----- -------------------------------------------------
1 Typ=1 Len=10: 48,49,50,51,52,0,53,54,55,56
Как вы можете видеть, дамп показывает фактически CHR (0) находится там, хотя, показывая строку на экране, инструмент считает CHR (0) как нулевой ограничитель и не показывает остальных. Таким образом, казалось, что regexp_like фактически находит соответствие для chr (0) внутри строки.
Но, к моему полному разочарованию, я обнаружил, что даже строка без chr (0) вернет тот же результат.
DELETE FROM t1;
INSERT INTO t1 VALUES('');
SELECT CASE WHEN REGEXP_LIKE(col1,CHR(0)) THEN 1 ELSE 0 END op,col1, dump(col1) FROM t1;
op col1 dump(col1)
----- ------- ----------------------------------------------------
1 Typ=1 Len=10: 48,49,50,51,52,53,54,55,56,57
Так что есть что-то рыболовное для обработки chr (0). Я опубликовал следующий вопрос и получил объяснение по тому же вопросу. chr (0) является строкой с нулевой длиной, всякий раз, когда мы пытаемся найти ее внутри строки, она, по-видимому, найдет ее повсюду, фактически найдя ее на самом деле нигде.
Кажется, что невозможно найти chr (0) в строке. См. Ответ от MTO.
CHR(0) in REGEXP_LIKE
Нет, * null character * ('chr (0)') - это * not * то же, что и пустая строка, или NULL, которая совершенно иная. –
@JeffreyKemp: Я думаю, вы имеете в виду 'NUL', а не' NULL'? Несмотря на это, они не совпадают - согласились. –
Нет, что вы подразумеваете под NUL? –