【发布时间】:2014-10-30 15:58:19
【问题描述】:
我需要验证将在数据库中存储为 VARCHAR2(4000 字节) 列的字符串值的最大长度。我应该采取的最大长度是多少?我假设是 2000 年,因为 Java 字符串是用 UTF-16 编码的,但我错过了什么吗? 2000个字符的字符串有没有可能占用超过4000个字节?
【问题讨论】:
我需要验证将在数据库中存储为 VARCHAR2(4000 字节) 列的字符串值的最大长度。我应该采取的最大长度是多少?我假设是 2000 年,因为 Java 字符串是用 UTF-16 编码的,但我错过了什么吗? 2000个字符的字符串有没有可能占用超过4000个字节?
【问题讨论】:
不,Java 中 2000 个字符的字符串不能超过 4000 个字节的字符数据。您可能偶尔会听到有人说 UTF-16 是一种可变长度编码,因为它可能需要 2 或 4 个字节来表示一个 Unicode 代码点。虽然这是真的,但这无关紧要,因为 Java 的“字符”不是 Unicode 代码点,而是 UTF-16 代码单元,它总是 2 个字节。因此,一个 2000 字符的字符串 在 Java 中 正好是 4000 字节的 UTF-16 数据。
切向警告:根据您对 VARCHAR2 的使用,在我看来您使用的是 Oracle 数据库。 Oracle 有两个主要的字符集设置,数据库字符集和国家字符集。第一个由 VARCHAR2 列(以及其他)使用,另一个由 NVARCHAR2 列(同样,等等)使用。 UTF-16 不支持用作数据库字符集,但适用于国家字符集。我不知道你的数据层是什么样的,所以我不能说这会对你产生什么影响,但你可以阅读this Oracle document on character sets了解更多信息。
总而言之,Java 中 2000 个字符的字符串在其他地方可能最终超过 4000 个字节——如果在某个地方,它会被转换为不同的编码。
【讨论】:
在 UTF-16 中,根据我在网上阅读的内容,Java 可以用一个或两个 16 位值表示字符。最好的检查方法是使用您可能编码的示例字符串并打印出长度,然后将其用作应用程序开发的参考。
以下是您可以用来测试的示例代码:
String s = "Hello, world!";
int byteCountUTF16 = s.getBytes("UTF-16").length;
【讨论】: