Thursday, June 4, 2009

miraculous oracle

и снова разработчики оракла постарались на славу. то есть я понимаю, как они дошли до такого, но не понимаю почему.

допустим, в таблице есть поле 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: