将非英文字符串插入到UTF-8 Oracle数据库中

问题描述:

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

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

+0

的数据类型是列?另外,为了长度,可以使用'LENGTHB'(长度以字节为单位),而不是'LENGTH'(长度以字符为单位)。 – 2013-04-10 15:23:45

+0

如果你想做@ EgorSkriptunoff的答案,但在Java中,请参阅http://*.com/questions/2726071/efficient-way-to-calculate-byte-length-of-a-character-取决于 - 上的编码。 – 2013-04-10 15:32:06

使用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