Как исправить ошибку импорта данных в кодировке CP-1251: ORA-12899: value too large for column
Есть дамп БД с кодировкой CP-1251 и там есть кириллица. Нужно импортирвать этот дамп в БД с кодировкой UTF-8.
При запуске импорта через утилиту impdp получаю вот такую ошибку:
KUP-11007: conversion error loading table "main"."address"
ORA-12899: value too large for column 'address' (actual: 2, maximum: 1)
Создавать БД с кодировкой CP-1251 не удобно. Нужно выполнить импорт в UTF-8.
Как решить проблему без смены кодировки самой целевой БД?
Ответы (1 шт):
Нельзя перелить литровочку в поллитровик записать два байта в один.
CP-1251 это однобайтная кодировка, например, символ "Б" в ней представлен одним байтом. В UTF-8 этот же символ представлен двумя байтами:
select
dump (convert ('Б', 'CL8MSWIN1251','AL32UTF8'), 16) cp1251,
dump ('Б', 16) utf8
from dual
/
CP1251 UTF8
--------------- -------------------
Typ=1 Len=1: c1 Typ=96 Len=2: d0,91
Наглядно, что происходит в данном случае:
create table t1 (a varchar2(1))
/
insert into t1 values ('Б')
ORA-12899: value too large for column "ME"."T1"."A" (actual: 2, maximum: 1)
Импорт делает тоже самое, он знает кодировку данных дампа и целевой БД, формирует запросы вставки с перекодировкой символьных колонок, но запросы завершаются ошибкой - записать колонки в кодировке целевой БД он не может.
Рекомендуемое решение - следует в целевий БД все колонки, участвующее в импорте и потенциально содержащие кириллические символы, изменить на символьную семантику, то есть чтобы кол-во символов считалось посимвольно, а не побайтно (по умолчанию):
alter table t1 modify a varchar2(1 char)
/
insert into t1 values ('B');
1 row inserted.