【问题标题】:Oracle SQL - Substr not removing enough charactersOracle SQL - Substr 没有删除足够的字符
【发布时间】:2012-12-13 02:20:48
【问题描述】:

我遇到了一个奇怪的问题。我有这样的代码。

insert into my_table
    substr(my_name,1,199)

给出的错误是:

值对于列...太大(实际:246,最大值:200)

查看我表中最大的名字,我有类似的东西:“8”x12"“

是否有可能发生了一些字符集的事情,所以当它插入时,字符数会增加?如果是这样,我该如何补救?我已经尝试在子字符串化之前显式转换为 UTF8,但这根本没有帮助。

【问题讨论】:

  • 您能否显示问题案例的 my_name 的完整值以及列定义。插入更通常是insert into table (columns) values (list),短语法有什么原因吗?
  • 你使用substr,所以你减去199个字符,在unicode中可能是246个字节,你的列定义为varchar2(200 byte)。可能应该在这里使用substrb
  • 您能发布用于该列的数据类型和长度吗?您使用的是varchar2(200 bytes) 还是varchar2(200 char)?如果您使用bytes,您可能无法存储 200 个字符,因为有些字符占用超过一个字节

标签: sql oracle character-encoding substr


【解决方案1】:

我建议尝试:

insert into my_table(col)
    select cast(substr(my_name,1,199) as varchar(200))

(我总是在插入中包含明确的列名。)

显式转换为 varchar 可以解决引擎认为字符串太长的问题。

【讨论】:

    【解决方案2】:

    根据上述两个 cmets,您需要检查基础知识。此外,如果您可以同时执行 substrb、substr on select 并观察差异,这也可能会有所帮助。

    这是一个很棒的article

    " 历史上保存字母数字数据的数据库列 使用它们存储的字节数定义。这种方法很好 当字节数等于字符数时 使用单字节字符集。随着多字节使用的增加 支持全球化数据库的字符集带来了以下问题 字节不再等同于字符。VARCHAR2 和 CHAR 类型 支持两种指定长度的方法:以字节为单位:VARCHAR2(10 字节)。 这将支持最多 10 个字节的数据,可能少至两个 多字节字符集中的字符。在字符中:VARCHAR2(10 字符)。这将支持最多 10 个字符的数据,可以是 多达 40 个字节的信息。”

    建议

    在使用多字节字符集(例如 UTF8)时,由于您的意图可能是定义一个实际上可以存储数据字符的列,因此您可以使用:

    • VARCHAR2/CHAR 定义中的 CHAR 修饰符。也就是说,使用 VARCHAR2(80 CHAR),而不是 VARCHAR2(80)。

    • 会话或系统参数 NLS_LENGTH_SEMANTICS 将默认行为从 BYTE 更改为 CHAR。

    不建议在系统级别范围内更改此设置,而是在 SESSION 范围内更改。

    它说,

    人们经常遇到的两个问题是:

    • 使用多字节字符集时,即 VARCHAR2(N) 不一定包含 N 个字符,而是 N 个字节。

    • VARCHAR2 的最大字节长度为 4,000,而 CHAR 为 2,000:

    【讨论】:

      【解决方案3】:

      你也可以使用 substrb:

       insert into my_table
           substrb(my_name,1,199)
      

      这会将字符串限制为前 199 个字节,而不是字符。

      【讨论】:

        猜你喜欢
        • 2013-08-02
        • 2011-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-25
        • 2011-02-09
        相关资源
        最近更新 更多