Java 值太大,即使由于日文字符导致字符串长度小于250个字符,也会导致列错误

Java 值太大,即使由于日文字符导致字符串长度小于250个字符,也会导致列错误,java,oracle,oracle12c,Java,Oracle,Oracle12c,我通过java代码插入数据,从一个DB获取数据,然后使用自己的API将其插入另一个系统。我正在打印字符串的大小,然后将该字符串设置为记录的名称,并且也进行了检查,如果超过250个字符,则将其修剪为250个字符。所以java代码中的name变量总是打印长度为250或小于250,这取决于列值的长度。虽然它总是小于或等于250个字符,但我仍然得到错误 ORA-12899:列“所有者”、“项目”、“名称”的值太大(实际值:515,最大值:250) 目标db列的数据类型为varchar(250字节) 如

我通过java代码插入数据,从一个DB获取数据,然后使用自己的API将其插入另一个系统。我正在打印字符串的大小,然后将该字符串设置为记录的名称,并且也进行了检查,如果超过250个字符,则将其修剪为250个字符。所以java代码中的name变量总是打印长度为250或小于250,这取决于列值的长度。虽然它总是小于或等于250个字符,但我仍然得到错误

ORA-12899:列“所有者”、“项目”、“名称”的值太大(实际值:515,最大值:250)

目标db列的数据类型为varchar(250字节)

如果姓名栏中有日文或非英文字符,我会面临这个问题?有人知道在代码级别应该做些什么来防止它吗

另外,DB是Oracle 12c


由于某些限制,我无法显示代码。但我已经对代码进行了双重验证,并且似乎只使用英语字符设置名称效果良好。

根据这一点,非英语字符在Oracle DB中以2字节存储:因此,您的问题可能是250个字符是UTF-8编码的非英语字符,因此需要2字节存储。因此溢出


一种解决方案是将列长度的定义更改为250个字符,而不是250个字节。

根据这一点,非英语字符在Oracle DB中存储为2个字节:因此,您的问题可能是250个字符是UTF-8编码的非英语字符,因此需要2个字节的存储。因此溢出


解决方案可能是将列长度的定义更改为250个字符,而不是250个字节。

请显示表/列定义和一些代码。在Oracle中是250个字节,还是250个字符-VARCHAR或NVARCHAR-这些详细信息很重要请显示表/列定义和一些代码。在Oracle中是250个字节,或者250个字符-VARCHAR或NVARCHAR-如果我们可以在java中基于字节对字符串进行子串,这些详细信息将很重要,因为目标数据库是供应商数据库,我无法对其进行任何修改,实际上每个字符有2、3或4个字节,具体取决于字符集。@Ravi Kumar:是的,您可以使用getBytes(字符集字符集)。返回一个字节[]。数组的长度应该是您的限制因素。但是您必须使用数据库的字符集,否则如果字符集不同,它可能无法工作。@thatjeffsmith:谢谢您的澄清。我想知道为什么是515而不是500,这就是原因。@AndreasMüller:谢谢你的帮助。我正在将其转换为字节数组并检查数组的长度。如果超过250,我将创建一个长度为250的子数组,然后从中创建一个字符串。如果我们可以在java中基于字节对字符串进行子串,我希望它也能正常工作,因为目标数据库是供应商数据库,我不能对它进行任何修改,实际上每个字符有2、3或4个字节,具体取决于字符集。@Ravi Kumar:是的,您可以使用getBytes(字符集字符集)。返回一个字节[]。数组的长度应该是您的限制因素。但是您必须使用数据库的字符集,否则如果字符集不同,它可能无法工作。@thatjeffsmith:谢谢您的澄清。我想知道为什么是515而不是500,这就是原因。@AndreasMüller:谢谢你的帮助。我正在将其转换为字节数组并检查数组的长度。如果超过250,我将创建一个长度为250的子数组,然后从中创建一个字符串。我希望它也能起作用