Есть ли какое-либо преимущество использования int vs varbinary для хранения битовых масок с точки зрения производительности или гибкости.
Для моих целей я всегда буду выполнять чтение этих битовых масок (без записи или обновления).
Есть ли какое-либо преимущество использования int vs varbinary для хранения битовых масок с точки зрения производительности или гибкости.
Для моих целей я всегда буду выполнять чтение этих битовых масок (без записи или обновления).
Вы обязательно должны использовать INT
(если вам нужно 32 флага) или BIGINT
(для 64 флагов). Если вам нужно больше флагов, вы можете использовать BINARY
(но вы, вероятно, также должны спросите себя, зачем вам так много флагов в вашем приложении).
Кроме того, если вы используете интегральный тип, вы можете использовать стандартные побитовые операторы. напрямую без преобразования массива байтов в целочисленный тип.
Если вам нужно больше флагов и вам приходится использовать BINARY
, вы теряете встроенную поддержку побитовых операторов и, следовательно, легкую поддержку проверки значений флагов. Я бы, вероятно, перенес проверку значений флагов в клиентское приложение, но если вам удобно программировать на T-SQL, это тоже вариант. Если вы используете C#, у вас есть класс BitArray
. с необходимыми операциями, а в Java у вас есть BitSet
а> класс.
BINARY(13)
(есть место для 104 бит/флажков). Однако вы теряете встроенную поддержку побитовых операторов. Я обновил свой ответ, чтобы предоставить некоторые варианты.
- person Ronald Wildenberg; 17.12.2013
Обычно считается предпочтительным использовать набор битовых столбцов вместо битовой маски. Они соберутся вместе на странице и не займут больше места. Хотя я тоже всегда использую столбец int или bigint, чтобы избежать ввода всех имен столбцов ... но с intellisense я, вероятно, выбрал бы битовые столбцы.
INT
. Прекрасно работает. Случай конечно необычный, но действующий.
- person ; 20.12.2013
Что ж, учитывая, что int имеет меньше места для хранения и, как правило, с ним немного проще работать, я не уверен, зачем вам использовать varbinary.
Обычно я согласен с ответом @hainstech об использовании битовых полей, потому что вы можете явно назвать каждое битовое поле, чтобы указать, что оно должно хранить. Однако я не видел практического подхода к сравнению битовых масок с битовыми полями. С помощью побитовых операторов SQL Server (&, | и т. д.) легко узнать, установлен ли диапазон флагов. Намного больше работы, чтобы сделать это с операторами равенства против большого количества битовых полей.