Как исправить ошибку импорта данных в кодировке 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 шт):

Автор решения: 0xdb

Нельзя перелить литровочку в поллитровик записать два байта в один.

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.
→ Ссылка