我需要验证将在数据库中存储为VARCHAR2(4000字节)列的String值的最大长度。我应该采取什么最大长度?我假设2000,因为Java String是用UTF-16编码的,但我错过了什么?有没有2000-charactr字符串可以占用超过4000字节的情况?
答案 0 :(得分:2)
不, Java中的2000个字符串不能超过4000个字节的字符数据。您可能偶尔会听到它说UTF-16是一种可变长度编码,因为它可能需要2或4个字节来表示Unicode代码点。虽然这是事实,但这是无关紧要的,因为Java"字符"不是Unicode代码点,而是UTF-16代码单元,总是2个字节。因此,Java 中的2000个字符的String 恰好是4000字节的UTF-16数据。
切向警告:基于您对VARCHAR2的使用,在我看来您使用的是Oracle数据库。 Oracle有两个主要的字符集设置,即数据库字符集和国家字符集。第一个由VARCHAR2列(以及其他列)使用,另一个由NVARCHAR2列(再次使用)使用。不支持UTF-16 用作数据库字符集,但用于国家字符集。我不知道您的数据层是什么样的,因此我无法说明这会对您产生什么影响,但您可以阅读this Oracle document on character sets以获取更多信息。
总而言之,Java中的2000个字符的字符串在其他地方最终可能超过4000个字节 - 如果在某个地方,它会被转换为不同的编码。
答案 1 :(得分:0)
在UTF-16中,根据我在线阅读的内容,Java可以用一个或两个16位值表示字符。检查的最佳方法是使用可能编码的样本字符串并打印出长度,然后将其用作应用程序开发的参考。
以下是可用于测试的示例代码:
String s = "Hello, world!";
int byteCountUTF16 = s.getBytes("UTF-16").length;