0
我有一個Oracle,它的編碼是UTF-8。當我插入一些非英文字符串時,我會得到ORA-12899。我認爲原因是一些非英文需要UTF-8系統中的3個字節。將非英文字符串插入到UTF-8 Oracle數據庫中
最簡單的解決方案是延長Oracle的長度。我想修剪字符串,找不到修剪字符串的單個解決方案。有什麼建議嗎?我試圖獲取字節長度,但該值不適用於UTF-8。
我有一個Oracle,它的編碼是UTF-8。當我插入一些非英文字符串時,我會得到ORA-12899。我認爲原因是一些非英文需要UTF-8系統中的3個字節。將非英文字符串插入到UTF-8 Oracle數據庫中
最簡單的解決方案是延長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
的數據類型是列?另外,爲了長度,可以使用'LENGTHB'(長度以字節爲單位),而不是'LENGTH'(長度以字符爲單位)。 – 2013-04-10 15:23:45
如果你想做@ EgorSkriptunoff的答案,但在Java中,請參閱http://stackoverflow.com/questions/2726071/efficient-way-to-calculate-byte-length-of-a-character-取決於 - 上的編碼。 – 2013-04-10 15:32:06