|
Помогите разобраться
|
|||
---|---|---|---|
#18+
Добрый день, В БД (SQL2008R2) ест таблица, в которой есть столбец, пусть "flags", тип Integer. При внесении изменений в таблицу триггером запускается процедура, в которой значениям в столбце присваивается новое значение через выражения вроде следующих: If flags&0x0200=0 begin Если выполняется условие такое-то, то: flags = flags|0x00040004 иначе flags = flags&0xfffffff7 end ... и т.д. 1. Подскажите, пожалуйста, в чем тайный смысл подобных манипуляций. В каких случаях используются именно такие присвоения (вместо конкретного значения)? 2. Как, в таком случае, определить нужные для результата запроса значения столбца, если потребуется сделать некую выборку по значению? 3. Если я правильно понимаю, то SQL преобразует два сравниваемых значения в двоичную систему и сравнивает побитно. В зависимости от типа сравнения получаем результирующее значение. Но непонятно, почему второе число задается в hex (если не ошибаюсь)? Заранее благодарю за ответы... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 12:50 |
|
Помогите разобраться
|
|||
---|---|---|---|
#18+
Sviman144, Это битовый флаг для хранения кучи boolean'ов о одном инте и доступ к ним. Вроде как сейчас в СУБД есть поля, которые занимают 1 бит и такой изврат не нужен. 1. Смысл зависит от контекста и от того, что в этих битах хранится. 2. Через & ставишь нужное бинарное значение и получаешь наличие нужных тебе флагов. 3. А через что его задавать, если не через hex? Бинарное представление в mssql завезли? Даже если да, то оно не такое удобное. А тут 0х01 - первый бит, 0x02 - второй, 0x04 - третий, 0x08 - четвёртный и т.д. А еще можно делать сдвиги. Но лучше такое не использовать вообще, по понятной причине. Иллюзорный выигрыш нескольких байт не стоит того. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 13:02 |
|
Помогите разобраться
|
|||
---|---|---|---|
#18+
Sviman144, полагаю, что используются и сравниваются битовые маски, где каждая позиция имеет свой логический смысл 0010100100111011 а хранится в инт-е, что в данном случае равняется 10555 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 13:05 |
|
Помогите разобраться
|
|||
---|---|---|---|
#18+
Благодарю за ответы. Т.е. получается, чтобы получить в выборке нужные результаты", нужно как-то разобраться в этих "масках" (какой бит отвечает за нужный результат)? И кроме того, как сравнивать (через "и" или через "или")? А если значение, например, трехзначное, допустим 902? Каким образом, программа побитно сравнивает его с тем же 0x00200020? Как-то "отсекается" все лишнее? Пример: select distinct flags from таблица where flags = flags|0x00200020 Результат: 60 вариантов "флагов" (в том числе 2097184) и select * from таблица where flags = flags&0x00200020 Результат: два варианта флагов 0 и 2097184. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 13:35 |
|
Помогите разобраться
|
|||
---|---|---|---|
#18+
Sviman144, почитайте https://docs.microsoft.com/en-us/sql/t-sql/language-elements/bitwise-operators-transact-sql https://www.mssqltips.com/sqlservertip/1218/sql-server-bitwise-operators-to-store-multiple-values-in-one-column/ кроме того, можно использовать calc.exe для конвертирования между HEX, DEC & BIN ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 13:55 |
|
Помогите разобраться
|
|||
---|---|---|---|
#18+
Sviman144, РСУБД - худшее место для битовых масок. Имхо ) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 15:31 |
|
Помогите разобраться
|
|||
---|---|---|---|
#18+
Критик Sviman144, РСУБД - худшее место для битовых масок. Имхо ) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 16:03 |
|
Помогите разобраться
|
|||
---|---|---|---|
#18+
Все равно не получается определить "контекст", по которому устанавливаются те или иные значения. Ок, спасибо за ответы и ссылки... Тему можно считать закрытой. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 18:27 |
|
Помогите разобраться
|
|||
---|---|---|---|
#18+
alexeyvg Критик Sviman144, РСУБД - худшее место для битовых масок. Имхо ) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 18:44 |
|
Помогите разобраться
|
|||
---|---|---|---|
#18+
andreymx а кто потом вспомнит, что признак "наличие длинных волос в левой подмышке" лежит в 45-м бите? Ну, знают же люди, что, например, в AD в атрибуте userAccountControl седьмой бит показывает, что у учетки не истекает срок действия пароля. Так и здесь - в документации описывать это нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2020, 19:45 |
|
Помогите разобраться
|
|||
---|---|---|---|
#18+
Сон Веры Павловны седьмой бит пардон, 17-й ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2020, 03:54 |
|
|
start [/forum/topic.php?fid=46&msg=40024272&tid=1685340]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 288ms |
total: | 428ms |
0 / 0 |