Я запускаю следующий запрос. Но получить ORA-12899. Хотя длина строки, которую я пытаюсь вставить, равна 30.
Вы должны указать максимальную длину для столбца VARCHAR2. Этот максимум должен быть не менее 1 байт, хотя фактической сохраненной строке разрешено быть строкой нулевой длины (»). Вы можете использовать квалификатор CHAR, например VARCHAR2 (10 CHAR), чтобы указать максимальную длину в символах вместо байтов. Символ является технически кодовой точкой набора символов базы данных. Вы можете использовать квалификатор BYTE, например VARCHAR2 (10 BYTE), чтобы явно указать максимальную длину в байтах. Если явный классификатор не включен в определение столбца или атрибута при создании объекта базы данных с этим столбцом или атрибутом, то семантика длины определяется значением параметра NLS_LENGTH_SEMANTICS сеанса, создающего объект.
Если ваш сеанс использует семантику байтов, столбец в вашей таблице будет по умолчанию:
То же самое, что и явное:
Если ваши исходные данные составляют пять символов, но содержат любые многобайтовые символы, количество байтов будет превышать пять:
Это то, что вы видите. Когда вы вставляете значения из другой таблицы, вы фильтруете длину значений, но length() подсчитывает символы, а не байты. Существует функция lengthb() , которая подсчитывает байты. Если вы проверите длину байта 30-значного значения, которое вы выбрали, вы увидите, что оно фактически равно 31 байту, поэтому один из этих символов является многобайтным.
Из значений dump() вы можете видеть, что после Testing ( 54,65,73,74,69,6e,67 ) и перед пробелом и тире ( 20,2d ) у вас есть c2,a0 , который многобайтовый неразрывный пробел UTF-8. (Вы часто видите, что вместе с фигурными кавычками и другими символами диапазона, отличными от ASCII, в тексте, который был скопирован, например, из документа Word).
Вы можете либо изменить свою вставку на фильтр на LENGTHB(column1)=30 (который исключает найденную вами строку), либо изменить определение столбца на 30 символов вместо 30 байтов:
Или заменить любые неожиданные многобайтовые символы однобайтными эквивалентами, если это возможно и имеет смысл для ваших данных; в этом случае нормальное пространство может работать, но с любой заменой вы уничтожаете информацию, которая может быть действительно важной.
Попробуйте изменить таблицу, например
Ошибка указывает, что ваш столбец1 может хранить не более 30 символов, и вы пропускаете в нем более 30 символов, что приводит к ошибке.
Из-за разных параметров NLS в базе данных целевой таблицы может потребоваться больше байтов в целевом объекте. Попробуйте изменить таблицу как alter table1 изменить column1 varchar2 (30 char)
Часто, поскольку наши компании растут и развиваются в ответ на расширение в виде клиентской базы, персонала, прибыли или рынков, данные, связанные с этим ростом, также будут меняться. Системы данных, такие как У Oracle есть врожденная способность оставаться достаточно гибкой в отношении работая с этим изменением информации. Тем не менее, даже самые универсальные системы баз данных требуют обслуживания и доработки в лицом повышенного трафика данных. Эта работа имеет важное значение для с учетом любых ограничений на память или необходимых переопределений параметры. Ошибка ORA-12899 является представителем экземпляра в который либо всплеск данных, либо ошибка пользователя заставляет Oracle в течение запрошенного действия.
ORA-12899 — это ошибка Oracle, которая возникает, когда введенное значение в строку столбца слишком велико. Это означает, что пользователь попытался обновить или вставить столбец со значением который слишком широк для столбца назначения. Название конкретного столбец и фактическая ширина значения, а также максимальная ширина, разрешенная для столбца, будет связана с этим. Как уже упоминалось, значение может быть задано в виде символов. в что ширина будет указана в символах, это будет означать, что семантика длины символа работает для столбца. В противном случае ширина будет сообщена в байтах. По сути, эта ошибка возникает из пытаясь проталкивать значение или набор значений, превышающих указанная максимальная ширина столбца. Итак, как пользователь исправляет этот тип ошибки?
Для начала откройте служебную программу OERR. Пользователь потребует полного ORA-12899 для получения правильной обратной связи по ошибке. Эта будет предоставлять дополнительную информацию об ошибке и расследование. Как правило, ошибка может исходить от одного из трех источники. Первым источником являются инструкции SQL, которые были генерироваться. Проверка типов данных столбцов источника и получателя на выясните, совместимы ли они с текущими форматами. второстепенный источник. Наконец, пользователь может посмотреть столбец назначения width — где значение присваивается — чтобы убедиться, что он большой достаточно для размещения максимального значения, которое пользователь ожидает назначения. Обратимся теперь к примеру, который исправляет ORA-12899. Предположим, что пользователь создал следующую таблицу:
Затем пользователь пытается выдать оператор INSERT VALUES, который выглядит что-то вроде этого:
Пользователь может попытаться запустить инструкцию здесь, но получит следующее сообщение об ошибке:
Ошибка, начиная с строки 7 в команде: INSERT INTO Клиенты ЦЕННОСТИ (727546345, "Рики Галорей", 18 Бенджамин Роуд Сиракузы, ‘13208, 05307623754) Отчет об ошибке: Ошибка SQL: ORA-12899: значение тоже большой для столбца "ОРГАНИЗАЦИИ". "РЫНОК". "АДРЕС" (актуально: 25, максимум: 20) 12899. 00000 — значение слишком велико для столбца% s (фактическое: % s, максимум:% s) "
Этот оператор ошибки указывает, что переменная ‘Address не может содержать более двадцати символов, так как это превысит ширину столбца. Когда мы оглянемся на значение адреса (18 Бенджамин Road Syracuse), мы видим, что общее количество символов (25) превышает максимальное допустимое значение ширины столбца. к исправьте это, пользователь может изменить VARCHAR2 для адреса на количество, которое может соответствовать типичной длине адреса, компания будет вводить.
Имеется файл, с которого считываются данные и они же добавляются в БД Oracle.
Проблема на примере:
Поле VARCHAR2 , размером 3 байта
Пытаемся вставить туда ‘абв’ и тут же ловим exception:
value too large for column (actual: 6, maximum: 3)
Т.е., каждый символ кодируется двумя байтами. Окей, подумал я, сейчас перекодируем. В БД стоит кодировка AL32UTF8 . Кодировка файла — CP866 .
Попытка безуспешной перекодировки:
Изменять тип колонок нельзя. Каким образом можно решить эту проблему? Возможно ли как-то явно указать кодировку добавляемого значения при вставке данных в БД?
1 ответ 1
Самое простое решение, изменить семантику длины полей, в которых предпологается хранить информацию с не ASCII символами.
В примерах используются юникоды: