6

我们正在尝试保存下面的字符串,它实际上是数据库中的一个名称,我们进行了一些 api 调用,我们得到了这个名称:

株式会社エス・ダブリュー・コミュニケーションズ</p>

在通过我们的代码保存时(如在 servlet - hibernate - 数据库中),我们得到一个错误:

Caused by: java.sql.BatchUpdateException: ORA-12899: value too large for column "NAME_ON_ACCOUNT" (actual: 138, maximum: 100)

这是 23 个字符,但看起来每个字符占用 6 个字节,这只会使它成为 138 个。

下面的代码给了我69:

byte[] utf8Bytes = string.getBytes("UTF-8");    
System.out.println(utf8Bytes.length);

这给了我 92:

byte[] utf8Bytes = string.getBytes("UTF-32");
System.out.println(utf8Bytes.length);

我肯定会检查NLS_CHARACTERSET并查看 IO 类,但你见过一个占用 6 个字节的字符吗?任何帮助都感激不尽。

4

2 回答 2

3

它可能将 HTML 实体保存在一个字符串中。喜欢&#29123;或可能是 URL 样式,%8C%9A. 或者也许是 UTF7,比如[Ay76b. (我编造了这些值,但您的实际值将是相似的)。依赖任何具有字符编码的框架总是很痛苦,因为它的作者可能是美国或欧洲人,两者都足以满足一个字节等于一个字符的简单 ANSI。如果您设法理解您的编码并将其转换为真正的 UTF8 甚至 UTF16,那么在这种特殊情况下占用的空间会更少。

于 2013-04-02T19:37:02.710 回答
0

你可能真的有:

\u682a\u5f0f\u4f1a\u793e\u30a8\u30b9\u30fb\u30c0\u30d6\u30ea\u30e5\u30fc\u30fb\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u30ba

看:

"\u682a\u5f0f\u4f1a\u793e\u30a8\u30b9\u30fb\u30c0\u30d6\u30ea\u30e5\u30fc\u30fb\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7\u30f3\u30ba".length();
//23, or 69 UTF-8 bytes

对比:

"\\u682a\\u5f0f\\u4f1a\\u793e\\u30a8\\u30b9\\u30fb\\u30c0\\u30d6\\u30ea\\u30e5\\u30fc\\u30fb\\u30b3\\u30df\\u30e5\\u30cb\\u30b1\\u30fc\\u30b7\\u30e7\\u30f3\\u30ba".length();
//138, or 138 UTF-8 bytes
于 2013-04-03T10:29:11.353 回答