繁体   English   中英

将非英语字符串插入UTF-8 Oracle数据库

[英]Insert non-English string into UTF-8 Oracle database

我有一个Oracle,它的编码是UTF-8。 当我在其中插入一些非英语字符串时,我会得到ORA-12899。 我认为原因是一些非英语的UTF-8系统需要3个字节。

最简单的解决方案是延长Oracle的长度。 我想修剪字符串,但找不到单个解决方案来修剪字符串。 有什么建议吗? 我试图获取字节长度,但该值不适用于UTF-8。

使用lengthb()获得以字节为单位的长度。 截断字符串,直到适合列:

while lengthb(x) > column_length_in_bytes loop
  x := substr(x, 1, length(x)-1);
end loop;
public static String truncatedUTF8( String input, int maxBytesInUTF8 ) {
    if( input.length() * 4 <= maxBytesInUTF8 ) {
        return input;
    }
    int max = 0, i;
    boolean lastSurrogate = false;
    for( i = 0; i < input.length() && max <= maxBytesInUTF8; ++i ) {
        int cc = Character.codePointAt(input, i);
        lastSurrogate = false;
        if (cc <= 0x7F) {
            max++; 
        } else if (cc <= 0x7FF) {
            max += 2; 
        } else if (cc <= 0xFFFF) {
            max += 3;
        } else if (cc <= 0x10FFFF) {
            lastSurrogate = true;
            max += 4;
            i++;
        }    
    }

    if( max < maxBytesInUTF8 ) {
        return input;
    }
    if( max > maxBytesInUTF8) {
        i--;
        if( lastSurrogate ) i--;
    }

    if( i - 1 >= input.length() && 
        !Character.isSurrogatePair(input.charAt(i-2), input.charAt(i-1)) &&
        Character.isSurrogate(input.charAt(i-1))) {
        i--;
    }

    return input.substring(0, i);
}

System.out.println(truncatedUTF8("äää", 5));
//"ää" because "äää" takes 6 bytes and "ää" takes 4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM