【发布时间】:2018-11-27 14:55:51
【问题描述】:
我需要知道一个字符串是否只包含 ASCII 字符。到目前为止,我使用这个正则表达式:
DECLARE
str VARCHAR2(100) := 'xyz';
BEGIN
IF REGEXP_LIKE(str, '^[ -~]+$') THEN
DBMS_OUTPUT.PUT_LINE('Pure ASCII');
END IF;
END;
/
Pure ASCII
' ' 和 ~ 分别是第一个。 ASCII 中的最后一个字符。
问题是,此 REGEXP_LIKE 在某些 NLS 设置上失败:
ALTER SESSION SET NLS_SORT = 'GERMAN';
DECLARE
str VARCHAR2(100) := 'xyz';
BEGIN
IF REGEXP_LIKE(str, '^[ -~]+$') THEN
DBMS_OUTPUT.PUT_LINE('Pure ASCII');
END IF;
END;
/
ORA-12728: invalid range in regular expression
ORA-06512: at line 4
有人知道独立于当前用户 NLS 设置的解决方案吗?这种行为是故意的还是应该被视为错误?
【问题讨论】:
-
这个能用吗:
IF (ASCIISTR(str) = str) THEN? -
[ -~]是可打印的 ascii,但 ascii 确实是 7 位[\x00-\x7F] -
有趣的是,反斜杠似乎未能通过该测试;
asciistr('\')给出\005C,大概是为了避免混淆,因为它在输出中具有特殊含义。 -
@sln,
[\x20-\x7E]也会引发 ORA-12728 -
@sln - 在 Oracle 的德语语言排序顺序中,字符 x20 比字符 x7E“更大”。 x7E 是#63,x20 是#66。完整的可打印 ASCII 字符范围是 x21 - x39。