2
我有一个表(如ELEMENTS
),其中一个名为NAME
的VARCHAR字段编码在ccsid 1144
中。我需要找到NAME
字段中包含“非ASCII字符”的所有字符串,即字符集中没有ASCII字符的ccsid 1144
字符集。DB2 SQL查询来查找字符串中的非ASCII字符
我有一个表(如ELEMENTS
),其中一个名为NAME
的VARCHAR字段编码在ccsid 1144
中。我需要找到NAME
字段中包含“非ASCII字符”的所有字符串,即字符集中没有ASCII字符的ccsid 1144
字符集。DB2 SQL查询来查找字符串中的非ASCII字符
我想你应该能够创建这样一个功能:
CREATE FUNCTION CONTAINS_NON_ASCII(INSTR VARCHAR(4000))
RETURNS CHAR(1)
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE POS, LEN INT;
IF INSTR IS NULL THEN
RETURN NULL;
END IF;
SET (POS, LEN) = (1, LENGTH(INSTR));
WHILE POS <= LEN DO
IF ASCII(SUBSTR(INSTR, POS, 1)) > 128 THEN
RETURN 'Y';
END IF;
SET POS = POS + 1;
END WHILE;
RETURN 'N';
END
然后写:
SELECT NAME
FROM ELEMENTS
WHERE CONTAINS_NON_ASCII(NAME) = 'Y'
;
(免责声明:完全未经)
由根据文档判断,—似乎是VARCHAR
是一串字节,而不是Unicode字符TER值。 (字节范围从0到0xFF; Unicode字符范围从0到0x10FFFD。)如果您有兴趣支持Unicode,则可能需要使用不同的数据类型。
+1感谢您使用ASCII函数,但是db2手册指出:*在Unicode数据库中,如果提供的参数是图形字符串,则在函数执行前首先将其转换为字符串*。据我所知,不会有任何> 128的数字会被ASCII返回,实际上欧元符号是26 – Gabber
@Gabber:我看到这个语句,但是由于'VARCHAR'总是一个字符串,而不是一个图形字符串,我不认为这是相关的。 (换句话说,我理解该语句意味着不会有任何大于** 255 **的数字会被'ASCII'返回。) – ruakh
从db2 manual:* VARCHAR:变长字符串,最大长度为n字节*,没有关于编码的假设,只是它的长度。我不会有问题,但我仍然在我的varchar字段中找到那些该死的€字符:) – Gabber