所以我试图将数据保存到Oracle数据库。我有一个字符串:
Väste
(某处某州的名称)。
当我对它执行.length()时,我得到5,但是当我将它保存到数据库时,我得到:
ORA-12899: value too large for column "dude"."POST_ADR"."STATE_CD" (actual: 6, maximum: 5)
那么如何获得“oracle”长度?
答案 0 :(得分:9)
答案 1 :(得分:9)
正如其他人所示,您可以使用Oracle数据库的字符集将Java字符串转换为字节数组,然后从中获取字节长度。但是,这依赖于知道数据库的字符集是什么 - 不同的数据库将具有不同的字符集,这将导致不同字符集中相同字符串的不同字节长度。
假设您的数据库使用的是可变宽度字符集,如UTF-8(AL32UTF8的NLS_CHARACTERSET
),您还可以根据字符长度而不是字节长度在Oracle中声明列。这可以简化您的代码,因为您只需检查字符串的字符长度。它还简化了用户的通信。用户通常很难理解为什么字段有时可以存储5个字符,而有时它会拒绝2个字符的字符串,具体取决于字符串中的字符(UTF-8字符集中的1个字符最多需要3个字节)存储)。
默认情况下,声明列
时CREATE TABLE foo (
col_name VARCHAR2(5)
);
告诉Oracle允许最多5个字节的数据。但是,如果要允许5个字符的数据而不管字节数,则可以使用字符长度语义
CREATE TABLE foo (
col_name VARCHAR2(5 CHAR)
);
假设您要在运行DDL时为所有表执行此操作,还可以在运行DDL之前在会话级别设置nls_length_semantics
ALTER SESSION SET nls_length_semantics = CHAR;
CREATE TABLE foo (
col_name VARCHAR2(5)
);
创建一个包含最多5个字符数据的列的表。
答案 2 :(得分:7)
因为您正在使用组合字符,所以应该获取基础字节数组,然后获得该长度:
"Väste".getBytes(java.nio.charset.StandardCharsets.UTF_8).length
将打印出6。
答案 3 :(得分:0)
public static int getByteSize(String content) {
int size = 0;
if (null != content) {
try {
size = content.getBytes("utf-8").length;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return size;
}
的System.out.println(getByteSize( “Väste”)); // 6 的System.out.println(getByteSize( “VAAA”)); // 7