:: Visual Foxpro, Foxpro for DOS
Re: VarChar
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Не совсем верно. Помимо бита в служебном (_NullFlags) поле используется и один из байт собственно данного поля для хранения "реального размера данных". Алгоритм тут простой:
если реальный_размер = максимальный_размер_поля то:
Данные хранятся идентично полю типа Character
Бит "усечения размера" в служебном поле _NullFlags сброшен.
иначе
Реальные данные хрянятся как Character (с хвостовыми пробелами!), но в последнем байте этой "строки" хранится её реальный размер (т.е. это не "отдельный байт с размером", а просто последний байт из пространства отведённого для этого поля).
Бит "усечения размера" в служебном поле _NullFlags установлен.
к.в.
Таким образом данные типов Varchar(N)/Varchar(binary)(N)/Varbinary(N) - где N - это их "максимально допустимый размер" физически занимают N байт + 1 бит в служебном поле _NullFlags... Естетсвенно, если поле объявлено как NULLable то оно будет использовать ещё один дополнительный бит (признак NULL) в этом служебном поле.
По сравнению с "большими СУБД" это конечно не есть "реальный varchar" - ибо для реализации реального надо по меньшей мере иметь возможность работы с записями переменной длинны - т.е. поломать всю схему работы с dbf-файлами - что по меньшей мере неразумно... Т.е. если надо "просто экономить место" - то как и раньше выход в использовании memo-полей (возможно с "тонкой" настройкой BLOCKSIZE), но вот для взаимодействия с "большими SQL серверами" эти новые типы весьма полезны.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: VarChar
Aleksey Tsingauz [MSFT]
Цитата:
Не совсем верно.

Здравствуйте, Игорь!

Что конкретно вы находите неверным в моем посте?

Алексей.
Ratings: 0 negative/0 positive
Re: VarChar
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
То что вы с Владимиром показали 2 аспекта, но отрицаете друг друга Он
ошибочно считает что байт размера это дополнительный байт (тогда как это
просто последний байт строки, который просто не использеется если поле
забито "под завязку"), ты же никак не упомянул что такой байт-счётчик
реально существует, но верно заметил о наличии дополнительного бита в
служебном поле (суть этого бита как раз в том чтобы указато фоксу - имеется
ли байт-счётчик или его нету - т.е. поле забито под завязку). Я лишь
скомпоновал обе эти части вместе




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: VarChar
Владимир Максимов
Автор

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
Был не точен. Когда я писал первоначальное сообщение я не очень внимательно почитал Help. На выходных "вскрыл" VarChar и посмотрел, как же это все реально записывается на диск. В общем, все как описал Игорь.




------------------
Ratings: 0 negative/0 positive
Re: VarChar
Aleksey Tsingauz [MSFT]
Цитата:
ты же никак не упомянул что такой байт-счётчик
реально существует

Здравствуйте, Игорь!

Действительно, help файл я не скопировал, просто ответил на опасения связанные с увеличением размера записи. Упоминать же байт счетчик в этом контексте не имеет смысла, его существование на размере записи никак не сказывается.

Aleksey Tsingauz
Visual FoxPro Dev Team
Ratings: 0 negative/0 positive
Re: VarChar
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
А blob по хранению как-нить отлчается от обычного memo?




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: VarChar
Aleksey Tsingauz [MSFT]
Цитата:
А blob по хранению как-нить отлчается от обычного memo?

Нет, не отличается.

Aleksey Tsingauz
Visual FoxPro Dev Team
Ratings: 0 negative/0 positive
Re: VarChar
Владимир Максимов
Автор

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
Один-в-один обычное символьное поле.

CREATE CURSOR test (testBlob W, testMemo M)
INSERT INTO test (testBlob) VALUES ("Пример")
SELECT test
REPLACE testMemo WITH testBlob
?test.testBlob
?test.testMemo

Просто сделали очередной логичный шаг. Если в Memo(binary) не производили автотрансляцию кодовых страниц, то в BLOB вообще не конвертируют в символы. Оставляют "как есть" голый ASCII-код записанный в 16-ричной системе. То же самое делает функция:

?CreateBinary("Пример")

Область применения позиционируется такая же, как и для полей типа Memo(dinary)




------------------
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 13 alex;  (Гостей: 12)

© 2000-2024 Fox Club 
Яндекс.Метрика