我有一个 Oracle,它的编码是 UTF-8。当我在其中插入一些非英语字符串时,我会得到 ORA-12899。我认为原因是一些非英语在 UTF-8 系统中需要 3 个字节。
最简单的解决方案是延长 Oracle 的长度。我想修剪字符串,但找不到修剪字符串的单一解决方案。有什么建议吗?我试图获取字节长度,但该值不适用于 UTF-8。
我有一个 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