我们正在尝试保存以下字符串,这实际上是db中的名称,我们进行了一些api调用,我们得到了这个名字:
株式会社エス·ダブリュー·コミュニケーションズ
通过我们的代码保存(如在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个字节的字符吗?任何帮助将不胜感激。
答案 0 :(得分:3)
它可能在字符串中包含HTML实体。与燃
或可能的网址格式%8C%9A
一样。或者也许是UTF7,如[Ay76b
。 (我编写了这些值,但实际值相似)。依赖任何具有字符编码的框架总是很痛苦,因为它的作者很可能是美国或欧洲,两者都足以使用简单的ANSI,其中一个字节等于一个字符。
如果你设法理解你的编码并将其转换为真正的UTF8甚至是UTF16,那么在这种特殊情况下它会占用更少的空间。
答案 1 :(得分: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
Vs的:
"\\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