2013-02-20 2 views
0

У меня вопрос о сохранении побитовых флагов в sql. У меня есть несколько флагов статуса, которые я хотел бы сохранить в поле SQL smallint. Таким образом, smallint может представлять от -32768 до 32767.SQL Побитово в SmallInt

Если я хочу использовать все 32 бита для хранения логических значений, как обращаться с битами. Например. Если я хочу хранить биты, составляющие номер 1, я бы обычно видел 31 нуль и 1 в LSB. Будет ли эта последовательность соответствовать значению в моем поле smallint? Что относительно 1 в MSB и ноль во всех остальных битах? Возможно, есть лучший способ хранить и запрашивать побитовые данные в SQL.

Заранее спасибо.

ответ

2

Использовать тип данных bit? Один за флаг вам нужно

SQL Server пакеты разрядных столбцов в столько байт, сколько необходимо

  • ДО 8 = 1 байт
  • 9-16 составляет 2 байта
  • ...

Двигатель БД также позаботится о всех бит-масках и т. Д. Для вас
Все, что вы видите, это дискретные значения бит

Итак ... зачем катиться?

+0

Возможно, он не хочет иметь 32 столбца в своем столе или обращается к значению извне в фрагменте кода. – muhmud

+0

Я бы принял ответ @muhmud, но он удалил его. У меня 96 столбцов, представляющих 15-минутные интервалы в день, поэтому его ответ был самым чистым в моих обстоятельствах. – Sparers

+0

Я не удалял его! По какой-то причине кто-то позвонил Уилл. Вот SQL, если вам это нужно: «выберите cast (16 как varbinary (4)), cast (cast (16 as varbinary (4)) & cast (0x0000010 as int) как varbinary (4))« – muhmud

-2

Идеальное решение - использовать 32 отдельных поля TinyInt. TinyInt поддерживает значения 0-255. Если вы пытаетесь использовать одно поле и выполняете обработку бит, вы теряете возможность индексировать любой из этих флагов так же, как если бы вы использовали поля типа бит.

+2

Итак, вы предлагаете использовать 32 байт против 4 байта с помощью бит? бит также может быть проиндексирован с использованием необработанного SQL: только GUI SSMS запрещает его. Наконец, если tinyint содержит только 0 или 1, то он не является хорошим кандидатом для индекса в любом случае, как бит. – gbn

+0

@Data Masseur - с побитовыми операциями вы можете сделать индекс в вычисленном столбце, который является результатом применения маски. – muhmud

Смежные вопросы