【问题标题】:ora-00972 identifier is too long oracle 10goracle 10g 的 ora-00972 标识符太长
【发布时间】:2011-02-16 19:09:26
【问题描述】:

我收到了标题中提到的错误。

我使用的是 36 个字符的 ID。此错误仅在我的 asp.net webform 的 sqldatasource 中引发。 当我在 Oracle sql developer 中执行更新时,这不是问题。

我该如何解决这个问题?

【问题讨论】:

    标签: c# asp.net oracle gridview sqldatasource


    【解决方案1】:

    Oracle 支持最多 30 个字符的标识符,并且您的标识符长度 36 大于此长度。所以将其长度设为 30 个字符。

    看到这个link

    【讨论】:

    • 我读到了,但正如我所说,我可以从 Oracle SQL 开发人员更新而不会出现该错误?
    【解决方案2】:

    如果您从另一个环境(例如 SQL Developer)成功执行 DML(UPDATE tableName SET ...),那么您的 asp.net 代码必须以某种方式错误地指定或构造表的名称或表的列名.如果 Oracle 在任何其他检查之前将其中任何一个解析为 >30 个字符,则会抛出此异常。

    正如 Srinivas 指出的那样,最大长度为 30,因此 36 个字符的标识符不能在 SQL Developer 中工作 - 你可以发布在 SQL Developer 中“工作”的语句吗?

    【讨论】:

    • 插入服务(SERVICE_ID)值('03eb2491-9145-414f-8bdb-c5827a74151c');并且该字段是 SERVICE_ID NVARCHAR2(36) NOT NULL
    • 我在这里很困惑 - 如果您收到 00972 错误,它指的是表名 (SERVICE) 或列名 (SERVICE_ID)。您插入的 DATA 长度的异常将导致 ORA-12899: value too large for column。您的 asp.net 层中是否存在一些错误捕获,可能会错误识别实际异常?
    【解决方案3】:

    SERVICE_ID NVARCHAR2(36) 非空

    您的 SQL Developer 是否配置为使用多字节字符集?疯狂的猜测,尤其是我预计会抛出 ORA-12899: value too large for column 而不是 ORA-00972。

    【讨论】:

      【解决方案4】:

      啊,我明白了 - 不是 36 个字符长的列名,而是实际数据。很高兴我们清除了那个。

      至于“为什么这是从 ASP.NET SqlDataSource 发生的”,我怀疑在某个地方在 ASCII 和 Unicode 之间转换存在问题。 NVARCHAR2 是 Unicode,但我怀疑某些东西在 Unicode 世界中表现不佳。检查您的 Web 服务器、您的客户端、您的数据库,以及您能想到的任何东西 - 我怀疑您会发现其中的某个地方有一个 ASCII 客户端,它不能正确地使用 Unicode,并且正在混淆大约 Unicode 字符串的长度(32 个 Unicode 字符占用 64 个字节(假设 UTF-16))。

      祝你好运。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-09
        • 2012-12-22
        • 1970-01-01
        • 2020-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-03
        相关资源
        最近更新 更多