1) для решения проблемы я храню строку из 1 пробела как #32
Остальное нужно для единообразия действий и понимания процесса.
2) читаем Хелен Борри:
"Использование типов фиксированной длины не рекомендуется для данных,
которые могут содержать ЗНАЧИМЫЕ конечные символы пробелов, или для
элементов, чья фактическая длина может сильно изменяться." (стр.204)
"Символьный тип переменной длины используется для хранения ТЕКСТОВ, потому
что размер хранимой структуры равен ФАКТИЧЕСКОМУ РАЗМЕРУ ДАННЫХ плюс два
байта. ВСЕ СИМВОЛЫ, введенные в поле переменной длины, ТРАКТУЮТСЯ КАК
ЗНАЧИМЫЕ, ВКЛЮЧАЯ НАЧАЛЬНЫЕ и КОНЕЧНЫЕ ПРОБЕЛЬНЫЕ СИМВОЛЫ" (стр.205)

На самом деле и в случае CHAR, и в случае VARCHAR:
- строка пробелов любой длины рассматривается как пустая, т.е. функция
OCTET_LENGTH дает 0
- конечные пробельные символы ВСЕГДА НЕ ЗНАЧИМЫЕ, т.е. '   #' = '   #   ',
(их длина одинаковая), что не соответствует вышеописанному.

Задача для этого простая - сжатие текста. При составлении словаря возникает
проблема хранения строк состоящих только из пробелов. В таком случае для
всех слов нужно добавлять конечный символ при записи и удалять его при
чтении. А так как в словаре могут быть слова типа A+B+C, то вся логика
обработки уходит на клиента или в UDF, что не есть хорошо.

 

--
View this message in context: 
http://firebird.1100200.n4.nabble.com/Char-VarChar-tp3338553p3340644.html
Sent from the firebird-russian mailing list archive at Nabble.com.

Reply via email to