在字符串中查找非ascii字符的DB2 sql查询

在字符串中查找非ascii字符的DB2 sql查询,sql,character-encoding,db2,Sql,Character Encoding,Db2,我有一个表(比如ELEMENTS),其中有一个名为NAME的VARCHAR字段,编码方式为ccsid 1144。我需要找到NAME字段中包含“非ascii字符”的所有字符串,即ccsid 1144字符集中不包含ascii字符的字符。我认为您应该能够创建如下函数: CREATE FUNCTION CONTAINS_NON_ASCII(INSTR VARCHAR(4000)) RETURNS CHAR(1) DETERMINISTIC NO EXTERNAL ACTION CONTAINS

我有一个表(比如
ELEMENTS
),其中有一个名为
NAME
的VARCHAR字段,编码方式为
ccsid 1144
。我需要找到
NAME
字段中包含“非ascii字符”的所有字符串,即
ccsid 1144
字符集中不包含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
(免责声明:完全未经测试。)


顺便说一下,从文档判断,
VARCHAR
似乎是一个字节字符串,而不是Unicode字符。(字节范围从0到0xFF;Unicode字符范围从0到0x10FFFD。)如果您对支持Unicode感兴趣,可能需要使用不同的数据类型。

+1感谢ASCII函数,但是db2手册指出:在Unicode数据库中,如果提供的参数是图形字符串,在执行函数之前,首先将其转换为字符串。据我所知,ASCII不会返回任何大于128的数字,事实上,欧元符号是26@Gabber:我看到了那句话,但由于
VARCHAR
似乎总是一个字符串,而不是一个图形字符串,我认为这与此无关。(换句话说,我理解该语句意味着
ASCII
永远不会返回大于255的数字)从db2手册:VARCHAR:最大长度为n字节的变长字符串中,没有关于编码的假设,只是关于其长度。否则我就不会有问题了,但是我仍然在我的varchar字段中找到了那些该死的欧元字符:)@Gabber:欧元符号是否真的被存储为
26
(因为那无论如何都是ASCII控制字符)?也许不必使用
ASCII(SUBSTR(INSTR,POS,1))>128
,而是尝试
ASCII(SUBSTR(INSTR,POS,1)),而不是32到127之间的字符?(这将检测小于SP
'
或大于tilde
'~'
的任何字符)不,我提到了UNICODE,因为我只需要了解一种可能的方法,UNICODE更为人所知,但编码是EBCDIC 1144,如前所述,对应的字符代码是159。还认为它执行模块操作是不正确的,因为159-127=32
SELECT NAME
  FROM ELEMENTS
 WHERE CONTAINS_NON_ASCII(NAME) = 'Y'
;