【发布时间】:2014-02-18 07:41:53
【问题描述】:
我正在使用带有 PL/SQL 的 Oracle 数据库 11g。程序是用 C#、.NET 4 编写的。
我有一个带有 varchar(4000) 列的表,我想在 DB 中存储一个泰语文本。 我发现当我尝试存储长度超过 1333 的泰语文本时,Oracle 会抛出异常,尽管最大长度为 4000:
ORA-01461:只能绑定 LONG 值以插入到 LONG 列中
我还注意到,当我以较小的限制工作时,它会按预期工作。即:varchar(10) - 允许长度为 10 的值和更长的文本抛出异常:
ORA-01401 插入的值对于列来说太大
根据我已经进行的测试,我可以假设从数字“X”开始,oracle 停止计算实际字母的长度。相反,它会乘以最长字母长度值中的字母数(在泰语中,最长字母的长度是 3 - 意味着它就像 3 个字符),所以 1333 * 3 = 3999 我只能添加另一个字符(使用类似的语言英文)。
我的问题:
- 为什么不同最大长度的行为会有所不同?
- 在尝试将文本插入表格之前,我能否知道文本的真正限制? (假设文本是泰语和英语,也可能是不同的语言)
重要提示:因为我需要支持一个非常大且功能强大的系统,所以我无法将数据类型切换到俱乐部,但它会解决问题。
感谢您的帮助。
编辑
我计算这 1333 个字符的字节数。它们的字节长度为 2666,仍然小于 4000。我知道最大长度以字节为单位,但我不明白为什么会出现上述异常。
我用:System.Text.ASCIIEncoding.Unicode.GetByteCount(text) 来检查字节数。
【问题讨论】:
-
4000表示 4000 个 字节 不是字符。如果您使用的是多字节字符集,则一个字符最多可以包含 4 个字节(取决于字符集) 使用varchar列无法克服此限制。如果您需要更多,则需要使用CLOB列 -
你的数据库的 NLS_CHARACTERSET 设置是什么?您是否考虑过
NVARCHAR2列? -
@Wooble:
NVARCHAR2列也限制为 4000 字节 -
存储在数据库中的 1333 个字母的字节数为 2668 - 小于 4000。另外,nvarchar 也有同样的问题。
-
@hadaco: 用什么编码? UTF-8 对所有泰语字符使用 3 个字节。