我面临一个奇怪的问题。我有这样的代码。
insert into my_table
substr(my_name,1,199)
给出的错误是:
列的值太大...(实际:246,最大值:200)
看看我表中最大的名字,我有类似的东西:“8”x12"“
是否有可能发生了一些字符集的事情,所以当它插入时,字符数会增加?如果是这样,我该如何补救?我已经尝试在子字符串化之前显式转换为 UTF8,但这根本没有帮助。
我面临一个奇怪的问题。我有这样的代码。
insert into my_table
substr(my_name,1,199)
给出的错误是:
列的值太大...(实际:246,最大值:200)
看看我表中最大的名字,我有类似的东西:“8”x12"“
是否有可能发生了一些字符集的事情,所以当它插入时,字符数会增加?如果是这样,我该如何补救?我已经尝试在子字符串化之前显式转换为 UTF8,但这根本没有帮助。
我建议尝试:
insert into my_table(col)
select cast(substr(my_name,1,199) as varchar(200))
(我总是在插入中包含明确的列名。)
显式转换为 varchar 可以解决引擎认为字符串太长的问题。
根据上述两个评论,您想检查基础知识。此外,如果您可以同时执行 substrb、substr on select 并观察差异,这也可能会有所帮助。
这是一篇很棒的文章
" 从历史上看,保存字母数字数据的数据库列是使用它们存储的字节数定义的。这种方法很好,因为当使用单字节字符集时,字节数等于字符数。随着多字节使用的增加支持全球化数据库的字符集带来了字节不再等同于字符的问题。VARCHAR2和CHAR类型支持两种指定长度的方法:以字节为单位:VARCHAR2(10字节)。这将支持最多10字节的数据,这可以在多字节字符集中最少两个字符。在字符中:VARCHAR2(10 char)。这将支持最多 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:
您还可以使用 substrb:
insert into my_table
substrb(my_name,1,199)
这会将字符串限制为前 199 个字节,而不是字符。