powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подскажите хорошее решение (+)
44 сообщений из 44, показаны все 2 страниц
Подскажите хорошее решение (+)
    #32510708
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Есть необходимость хранить некоторое кол-во (ну допусти 100) bool-вых значений в базе.
У меня была идея сделать в таблице поле типа SQL_TEXT и значение true|false хранить путем установки/сброса определенного бита в определенном байте.
Но чего-то как-то не очень получается :( т.к. сервер всеж-таки по моему подразумевает, что в поле типа SQL_TEXT будет хранится именно текст заканчивающийся '\0'

Кто, что посоветует?

Использовать блоб?
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510723
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чем varchar|char не устраивает? размерность мала?
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510731
IGORRR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А в чем сложность?
Я, например, флаги ставлю в полях типа smallint 0 - false; 1 - true
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510750
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так понял что Kostya не хочет заводить кучу полей, а хочет завести строку '01010101010101010101000111' и проверять по позициям. я бы для этого использовал простую строку.

правда саму ситуацию, лучше не допускать, обрабатывать ее ой как не удобно.
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510763
Nikola18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А не проще сделать табличку типа (TYPE Integer, ID Integer, B Bool).
Зато не придётся менять алгоритм при изменении количества значений (а как показывает практика: все ограничения приходится иногда пересматривать)
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510768
Scream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Dik76:
Varchar/Char не подходит, так как если случится так, что подряд 8 или более значений будут false , то может выйти \0 , который оборвет в этом месте строку :(

2 IGORRR:

По условию должна быть строка bool `ей, а не несколько полей... Я для таких полей вообще всегда домен делаю.

2 Kostya.:

Юзай blob. Или измени идеологию :)
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510772
Scream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Dik76:
Varchar/Char не подходит, так как если случится так, что подряд 8 или более значений будут false , то может выйти \0 , который оборвет в этом месте строку :(

2 IGORRR:

По условию должна быть строка bool `ей, а не несколько полей... Я для таких полей вообще всегда домен делаю.

2 Kostya.:

Юзай blob. Или измени идеологию :)
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510776
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробую еще раз объяснить :)
Допустим есть 100 переменных bool и что бы не заводить 100 переменных типа int, smallint и т.п. Я завел одно поле типа SQL_TEXT 64 byte.
По идее теперь я мог бы хранить в нем все свои переменные используя состояние бита каждого байта.
Но при попытке обновит напр TBL_MASK = 'þ' сервер выдает ошибку Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510779
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, наверно придется использовать блоб
Других вариантов похоже нет
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510799
IGORRR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Scream, по моему из условия следует только
>Есть необходимость хранить некоторое кол-во (ну допусти 100) bool-вых значений в базе.
Поэтому, почему не создать таблицу
Код: plaintext
1.
2.
3.
create table table1 (
id integer not null primary key,
var_name varchar( 50 ),  /*имя переменной*/ 
var_value smallint); /*ее значение*/ 

Дальше с ней будет удобно работать и с клиента и с сервера.
На мой взгляд трудновато делать разбор строки из ХП
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510805
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А поле типа массив не пробовал использовать?
И обращайся к элементу с № таким-то.
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510833
Scream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 IORRR:
Против таблички ничего особо против не имею - сам так часто делаю
Только для bool`ей делать отдельную табличку... При связи "1 к 1"... Расточительство, на мой взгляд
А строку разбирать - проблем особых не вижу. Для этого придумали маски

2 Zmeishe:
Половина средств доступа к InterBase (например, Builder`овский IBX) не умеют работать с массивами :((

--
LET`S ROCK!
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510836
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отдельная таблица не покатит.
Т.к. для каждой записи в таблице мне нужно будет хранить свой список настроек (100 bool-ов ).


Тут вот может сделать так, принять что если byte имеет значение 32(пробел) то он = 0 . Т.е. заменить '\0' на 32 и наоборот.
Только получается что один бит пропадает, но зато получается почти то что хотел :)
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510910
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScreamVarchar/Char не подходит, так как если случится так, что подряд 8 или более значений будут false, то может выйти \0, который оборвет в этом месте строку

Не очень понял, если есть строка '000000000000101010101' , то как это произойдет?
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510950
f_w_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если паковать не побитно, а по байтно. Например символами '0' и '1'. Ускоряем упаковку распаковку. Нет проблемы нуль символа. Правда увеличиваем объем в 8 раз:-(. Если это критично, то ....
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32510964
Nikola18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
Отдельная таблица не покатит.
Т.к. для каждой записи в таблице мне нужно будет хранить свой список настроек ( 100  bool-ов ).
Вот по-этому в предложенных вариантах и есть поля "TYPE" и "var_name" для обозначения записи, к которой относятся набор bool-вых значений.

А обрабатывать записи всё же удобнее, т.к. можно посчитать всякие значения, суммы, и т.д. а если у значения ещё указать какой-либо реквизит, то можно стандарным запросом менять значения.
Хотя всё зависит от постановки. Может объяснишь смысл этих bool-вых значений.
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32511000
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Dik76
Есть в памяти
char[0] = '\0' //Все false
char[1] = 7 // 00000111
Заносим в базу как
char[0] = 32 //00100000
char[1] = 7 // 00000111
Т.е. заменяем конец строки на пробел.
При считывании из базы в память заменяем char[0] = 32 -> 0


То Nikola18
Ну хорошо есть у нас таблица объектов, и каждый объект характеризуется 100 переменными true|false. В моем случае я просто добавляю в таблицу, где хранятся объекты, еще одно поле SQL_TEXT и там храню значения моих переменных. (При этом названия и номера битов я заранее знаю, они всегда постоянные)

Вы мне предлагаете завести еще одну таблицу (TYPE Integer, ID Integer, B Bool)
где будут храниться название поля, ид, значение. Ну и поскольку значения у разных объектов могут отличаться то надо бы добавить еще ссылку на объект.В этом случае имея 100 объектов в вашей таблице должно быть порядка 100х100 записей.

P.S. Подсчитывать мне ничего не надо :), ну разве что количество true и false у каждого объекта
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32511010
Nikola18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
Ну хорошо есть у нас таблица объектов, и каждый объект характеризуется  100  переменными true|false. В моем случае я просто добавляю в таблицу, где хранятся объекты, еще одно поле SQL_TEXT и там храню значения моих переменных. (При этом названия и номера битов я заранее знаю, они всегда постоянные)

Вы мне предлагаете завести еще одну таблицу (TYPE Integer, ID Integer, B Bool)
где будут храниться название поля, ид, значение. Ну и поскольку значения у разных объектов могут отличаться то надо бы добавить еще ссылку на объект.В этом случае имея  100  объектов в вашей таблице должно быть порядка 100х100 записей.
Объясняю: дополнительная таблица состоит из 3 полей:
(TYPE Integer, ID Integer, B Bool), где TYPE - номер "бита", ID - код объекта к которому принадлежит набор битов, B - собственно значение.
При этом значения типа False можно вообще не хранить, т.е. если нет записи с TYPE=5, то значение "пятого бита" = 0
Код: plaintext
1.
P.S. Подсчитывать мне ничего не надо :), ну разве что количество true и false у каждого объекта
select count(*) from T where T.ID=(КодОбъекта) and B - для подсчета TRUE
или
select МАКСИМАЛЬНОЕ_КОЛИЧЕСТВО_ЗНАЧЕНИЙ - count(*) from T where T.ID=(КодОбъекта) and B
все запросы с такой таблицей будт выполняться влёт если иметь индексы или FK по полю ID и TYPE.
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32511028
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ааа. Я почему то подумал что в TYPE хранится название, ну и другие не правильно понял :)

Можно конечно и так.
Особенно если нужна какая-либо их обработка (подсчет и т.п. )

Но только не нужна она (обработка) мне ;)

Спасибо
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32511601
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вы про массивы не забыли? От простого массива со smallint для каждого T & F до...
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32511851
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непонятно, в чём проблемы. Лично я храню в varchar, всё, что хочу. Подвергая это необходимой обработке....

...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32512656
Vagon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я недопонял...

А почему нельзя использовать текст вида "00134579876" или даже "98ab7fcd0897" ?
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32512667
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Vagon
Конечно можно
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513061
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Vagon А ты попробуй использовать "98ab7"+'\0'+"fcd0897"
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513089
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А для чего нужен '\0' ? Вопрос в организации системы флагов, как в середину должен попасть конец строки?
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513145
Scream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dik76А для чего нужен '\0' ? Вопрос в организации системы флагов, как в середину должен попасть конец строки?

Очень просто: допустим, состояния первых 40-ка флагов будет соответствовать " 98ab7 ". А следующие 8 флагов будут false (то есть битовые 0, что и отвечает ASCII '\0'). А следующие 56 флагов - " fcd0897 ". Итого имеем как раз то, что привел Kostya. - " 98ab7\0 fcd0897", то есть строку с '\0' в середине.
--
LET`S ROCK!
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513158
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понял, дело в способе организации строки:
'+-++++-----------+++++' - это не выход? (где "+" - true, а "-" - false)
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513162
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Он жлобится лишние биты содержать
2Вопрошавший: за что боремся?
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513210
Scream
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dik76Насколько я понял, дело в способе организации строки:
'+-++++-----------+++++' - это не выход? (где "+" - true, а "-" - false)
:) Ну, плюсики-минусики использовать в качестве true - false - это забавно... Сразу вспоминается давно забытое детство... Хотя, реально, способ ничем не хуже, чем использовать, скажем, ' T '-' F ' или ' 1 '-' 0 '
Если есть жгучая потребность экономить биты - можно ставить лидирующие биты в 1 и группировать не по 8 bool `ей в байт, а по 7.
А еще лучше - юзать BLOB
Если такой жгучей потребности нет - стОит прислушаться к авторитетам форума :) и размещать 1 bool в 1 байт

--
LET`S ROCK!
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513468
Vagon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
А ты попробуй использовать "98ab7"+'\0'+"fcd0897"

А зачем +'\0'+ если можно +"0"+ ?

строка "0" (8 бит, 1 Char) <=> (0 = '\0') = 0000 bin = 00000000 bin;
строка "1" (8 бит, 1 Char) <=> (1 = '\1') = 0001 bin = 00000001 bin;
строка "2" (8 бит, 1 Char) <=> (2 = '\2') = 0010 bin = 00000010 bin;
- - - - - - -
строка "f" (8 бит, 1 Char) <=> (15='\15') = 1111 bin = 00001111 bin;

Строки вида "98ab7" преобразуем числа и наоборот....

То же самое "01010010" (Dik76)...
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513638
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Боремся за красивой решение. :))

Попробую поработать так, не понравится, то сделаю в байте.
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513670
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видать времени лишнего у тебя дофигища!
Понятие "красоты" - весьма субъективно.
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513691
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
))

Работаю хорошо, вот истается время еще и подумать/поэкспериментировать немного :)
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513717
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не я твой шеф. Радуйся.
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513744
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:)
Чему же радоваться.
Был бы шефом, похвалил бы ;)
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513750
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, щаззз! ;)
За ловлю блох и экономию на спичках?!
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513765
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
За повышение своей квалификации
А то я из программиста превращюсь в оператора ЭВМ ;)
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32513790
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тренируйся на кошках!
А не на работе.
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32514256
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хех, так работа и заключается в поиске решиния проблем.
В принципе по трудозатратам, что в бите хранить, что в байте одинаково. А если на этом можно еще и сэкономить, то почему бы не воспользоваться.
А то если мы все будем решать свои проблемы за счет увеличения памяти, да покупки новых винтов, то что же это за специалисты такие, за не компетентность которых расплачивается заказчик.
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32514419
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От тока не надо пыли!
Ты посчитай, какова твоя экономия на реальных данных.
Потом почитай, как хранятся CHAR'ы. Про компрессию почитай.
Посчитай, как ужмётся строка состоящая только из 2 допустимых литералов.
А уж потом, скажи, а стоило ли?..
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32514552
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так рассказал бы :)
Как ужимаются CHAR-ы и как они хранятся
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32514657
Kostya.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, как я и говорил
"В принципе по трудозатратам, что в бите хранить, что в байте одинаково."
Остается только мое субъективное чувство красоты.
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32516282
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему никто не вспомнил про CHARACTER SET OCTETS ?

A?
...
Рейтинг: 0 / 0
Подскажите хорошее решение (+)
    #32520126
Valery Shiskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Если кол-во < 32 воспользоваться UDF функциями bin_x
2) Написать свои UDF, например в Delphi, выполняющие побитовые операции.
Это совершенно не сложно
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подскажите хорошее решение (+)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]