2012-10-26 220 views

回答

2

我想你应该能够创建这样一个功能:

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,则可能需要使用不同的数据类型。

+0

+1感谢您使用ASCII函数,但是db2手册指出:*在Unicode数据库中,如果提供的参数是图形字符串,则在函数执行前首先将其转换为字符串*。据我所知,不会有任何> 128的数字会被ASCII返回,实际上欧元符号是26 – Gabber

+0

@Gabber:我看到这个语句,但是由于'VARCHAR'总是一个字符串,而不是一个图形字符串,我不认为这是相关的。 (换句话说,我理解该语句意味着不会有任何大于** 255 **的数字会被'ASCII'返回。) – ruakh

+0

从db2 manual:* VARCHAR:变长字符串,最大长度为n字节*,没有关于编码的假设,只是它的长度。我不会有问题,但我仍然在我的varchar字段中找到那些该死的€字符:) – Gabber