count3=0;
until [ "$count2" == 2 ]; do
printLine "$TILE_BLACK"
printLine "$TILE_WHITE"
count3=$(($count3 + 1))
done
Вот мертвая петля. Вы проверяете count2
на наличие условия окончания цикла, но просто обновляете count3
. Исправьте это.
Вы обязательно должны использовать INT
(если вам нужно 32 флага) или BIGINT
(для 64 флагов). Если вам нужно больше флагов, вы можете использовать BINARY
(но вам, вероятно, также следует спросить себя, зачем вам так много флагов в вашем приложении).
Кроме того, если вы используете интегральный тип, вы можете использовать стандартный побитовые операторы напрямую, без преобразования байтового массива в целочисленный тип.
Если вам нужно больше флагов и вам нужно использовать BINARY
, вы теряете встроенную поддержку для побитовых операторов и, следовательно, простую поддержку для проверки значений флага. Возможно, я бы перенес проверку значений флагов в клиентское приложение, но если вам удобно программировать на T-SQL, это тоже вариант. Если ты'
Обычно считается предпочтительным использовать набор битовых столбцов вместо битовой маски. Они будут упакованы вместе на странице, поэтому они не будут занимать больше места. Хотя я тоже, кажется, всегда использую столбец int или bigint, чтобы избежать ввода всех имен столбцов ... но с intellisense я бы, вероятно, пошел с битовыми столбцами.
Я обычно согласен с ответом @ hainstech об использовании битовых полей, потому что вы можете явно назвать каждое битовое поле, чтобы указать, что это должно хранить. Однако я не видел практического подхода к сравнению битовых масок с битовыми полями. С помощью побитовых операторов SQL Server (&, |, etc ...) легко узнать, установлен ли диапазон флагов. Для этого нужно проделать гораздо больше работы с операторами равенства для большого числа битовых полей.
Что ж, учитывая, что int имеет меньше места для хранения и, как правило, с ним немного проще работать, я не уверен почему вы используете varbinary.