【问题标题】:Oracle - getting 'value too large' error while inserting dataOracle - 插入数据时出现“值太大”错误
【发布时间】:2018-11-19 17:56:25
【问题描述】:

我正在尝试在 oracle 11g 中插入 Northwind 示例数据库。虽然它主要工作,但对于一些插入查询,我得到以下错误 -

ORA-12899:列“SYSTEM”.“CUSTOMERS”.“CITY”的值太大 (实际:16,最大:15)

数据看起来像 -

Insert into CUSTOMERS
   (CUSTOMER_ID, CUSTOMER_CODE, COMPANY_NAME, CONTACT_NAME, CONTACT_TITLE, ADDRESS, CITY, REGION, POSTAL_CODE, COUNTRY, PHONE, FAX)
 Values
   (35, 'HILAA', 'HILARIÓN-Abastos', 'Carlos Hernández', 'Sales Representative', 
    'Carrera 22 con Ave. Carlos Soublette #8-35', 'San Cristóbal', 'Táchira', '5022', 'Venezuela', 
    '(5) 555-1340', '(5) 555-1948');

注意 city 值中的特殊 Ã。当我用普通 A 替换那个特殊字符时,它被成功插入。

Insert into CUSTOMERS
   (CUSTOMER_ID, CUSTOMER_CODE, COMPANY_NAME, CONTACT_NAME, CONTACT_TITLE, ADDRESS, CITY, REGION, POSTAL_CODE, COUNTRY, PHONE, FAX)
 Values
   (35, 'HILAA', 'HILARIÓN-Abastos', 'Carlos Hernández', 'Sales Representative', 
    'Carrera 22 con Ave. Carlos Soublette #8-35', 'San CristA³bal', 'Táchira', '5022', 'Venezuela', 
    '(5) 555-1340', '(5) 555-1948');

我没有减少字符数。数据长度不变的情况下,为什么oracle会报这样的错误?

【问题讨论】:

  • 您有编码问题,您显示的数据已损坏(UTF-8 解释为看起来像 ASCII)。
  • 为您的 CUSTOMERS 表创建一个新用户,您不应该接触 SYSTEM 或 SYS 架构。

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

我没有减少字符数。当数据长度不是 改了,为什么oracle会报这样的错误?

因为 number of characters not always = no of bytes 。 当数据库字符集为 UTF-8(一般为 true)时,有些字符需要超过 1 个字节才能存储在数据库中。

要验证这一点,您可以使用函数LENGTH,它给出字符长度和LENGTHB,它给出字节长度。

SELECT
    length('A'),
    length('Ã'),
    lengthb('A'),
    lengthb('Ã')
FROM
    dual;

LENGTH('A') LENGTH('Ã') LENGTHB('A') LENGTHB('Ã')
----------- ----------- ------------ ------------
          1           1            1            2

因此,如果将列定义为VARCHAR2( n BYTE) 而不是VARCHAR2( n CHAR),那么当您尝试插入一个字符串时会引发此错误,每个字符占用超过1 个字节,例如Ã

举个例子

create table test_byte( c VARCHAR2(1 byte) );
INSERT INTO test_byte(c) VALUES('Ã');

ORA-12899: value too large for column "HR"."TEST_BYTE"."C" (actual: 2,
maximum: 1)

但是,如果我将列指定为 1 CHAR,则插入有效。

create table test_byte2( c VARCHAR2(1 char) );
INSERT INTO test_byte2(c) VALUES('Ã');
1 row inserted.

请参阅此问题了解更多详情:Difference between BYTE and CHAR in column datatypes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多