【问题标题】:ORA-01704: string literal too long using long UTF-8 Character setORA-01704: 使用长 UTF-8 字符集的字符串文字太长
【发布时间】:2014-04-25 11:03:46
【问题描述】:

我正在测试一个最近转换为 UTF-8 的数据库。如果我使用长随机 UTF-8 字符插入 varchar2 字段(4000 个字符),我会得到: [ORA-01704: 使用长 UTF-8 字符集的字符串文字太长]

如果我将字符串减少到大约 3600 个字符,它就可以工作。是什么赋予了?有没有办法插入我的 4000 个字符?

请注意,字符串中有一些非常奇怪的字符。

谢谢。

【问题讨论】:

  • A varchar 列永远不能超过 4000 字节,无论您是使用 char 语义还是 byte 语义声明它.这在 12c 中发生了变化,您可以将数据库配置为允许 32K。
  • 您的数据库中是否有任何实际为 4,000 字节的字符串?如果不是,那么此刻没关系,不是吗?您的测试失败了,您现在知道原因了,但无论如何您都不需要它。
  • 很多很多 4000 个字符的字段。

标签: oracle utf-8 plsql


【解决方案1】:

From the documentation:

与最大字符长度无关,VARCHAR2 数据的长度不能超过 4000 字节。

因此,声明为 varchar2(4000 [char]) 的字段可以容纳 4000 个单字节字符,或者更少数量的多字节字符。你无法解决这个问题,至少在 12c 之前varchar2 支持高达 32k。

如果您确实需要在 11g 或更早版本中允许 4000 个多字节字符,则需要将列创建为 CLOB,它可以容纳千兆字节的数据。 (您可能也想read more on LOB storage)。

【讨论】:

  • 谢谢。因为不可能走 CLOB 或 c12 路线,所以我的选择是柠檬或酸橙(当我伸手去拿糖罐时)。
  • 或者龙舌兰酒......正如 Ben 提到的,只有当你的实际值是多字节并且长得那么长时,它才会成为问题;但如果你不这样做,我想你会有一个更小的字段。
  • 但是当@RickyD 正在迁移到 UTF-8 数据库时,假设有许多 4,000 个字符的列被重新创建为 4,000 个字符(即 16,000 字节)的列,但是旧数据库中的数据仍然是 4,000 字节 Alex。只有当实际需要向数据库中插入超过 4,000 个 字节 时,它才会成为问题。目前,似乎没有。值得认真研究,因为迁移所有代码以使用 CLOB 将是可怕的,并对应用程序产生巨大影响(因此您以后也不想这样做!)。
  • @Ben - 真;所有现有数据都必须是(最多 4000 个)单字节字符,而且它现在是 UTF-8 的事实并不一定意味着实际上会使用多字节字符,因为这是默认的 CS 和现在的建议。如果实际数据仍然只是单字节,这不是问题,我同意。 (所以我的“但是”是错误的......)
【解决方案2】:

单个 UTF-8 字符的长度可以超过 1 个字节。 Oracle 有 4000 字节的限制。因此,少于 4000 个 UTF-8 字符将适合 4000 字符长度的列。

【讨论】:

    【解决方案3】:

    最好将列的数据类型更改为 clob

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多