Oracle - ошибка «слишком большое значение» при вставке данных - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь вставить базу данных Northwind в Oracle 11g.Хотя это работало в основном, для некоторых запросов на вставку я получил ошибку ниже -

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');

Обратите внимание на специальное значение Ã в городе.Когда я заменил этот специальный символ на нормальный 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 выдает такую ​​ошибку?

1 Ответ

0 голосов
/ 10 июня 2018

Я не уменьшил количество символов.Когда длина данных не изменилась, почему 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.

Дополнительную информацию см. В этом вопросе: Разница между BYTE и CHAR в типах данных столбцов

...