допустим, в таблице есть поле VARCHAR2. максимальный размер поля такого типа — 4000 байт. теперь начинается fun. допустим, мы создаем поле типа VARCHAR2(100 CHAR). в реальности же будет создано поле размером x00 байт (где x — максимальное количество байт, которое потребуется для представления любого символа из UCS2 в UTF8). так, чтобы 100 любых символов из unicode поместились. хотя, возможно, внутри оно хранится в UCS2 и поэтому выделяется всего 400 байт.
отойдем от технических деталей и попробуем вставить 100 символов. у нас все получится, несмотря на кодировку. то есть вставится и 100 ASCII и 100 Kana.
теперь же попробуем выделить 4000 CHAR для этого поля. и что вы думаете? в такое поле может быть вставлено будет только то количество символов, которое в utf8 помещается в это количество байт. на другие значения будет выдано сообщение об ошибке.
совсем забыл: но это еще не все. для обхождения ограничения в 4000 байт нужно использовать CLOB. но просто так нельзя записать в CLOB более 4000 байт (меньше — можно). для записи нужно отказаться от
prepare ($$sql)
execute (@params)
и начать использовать
prepare ($sql)
foreach my $params (@params) {
if (sql_type_of ($param) eq 'CLOB') {
bind_param ($i, $param, {ora_type => 112})
} else {
bind_param ($i, $param)
}
}
execute
там, конечно, условия посложнее, но общее представление показывают
No comments:
Post a Comment