Перейти к контенту

Логический тип данных в tinyint'е!


Рекомендуемые сообщения

Ставлю значит одному полю тип tinyint(1), по идее это эквивалент логическому типу данных, НО получалось в это поле вставить циферку и 2, и 3, ... и 255 (большие числа уже сводит к 255).

 

Так вот надо мне штук 8 значений Да/Нет (например в таблицу ибф_мемберс, чтобы отметить какую инфу пказывать о пользвателе в левой колонке при просмотре тем).

 

Так лучше использовать 8 полей tinyint(1) или одно, но преобразовывать ее в двоичную систему исчисления. Например, 255=11111111, 0=00000000, 2=00000010 и тд

 

А потом вытаскивать эти нолики и одинички в соответствующие флажки отображать/не отбражать.

 

Тут конечно пострадает выборка пользователей, которые включили отдельную штучку... Но такая выборка впринципе почти нужна будет...

Ссылка на комментарий
Поделиться на других сайтах

Ставлю значит одному полю тип tinyint(1), по идее это эквивалент логическому типу данных

 

Скорее эквивалент логических данных это

enum('yes', 'no')

или

enum('true', 'false')

или

enum('1', '0')

 

Так лучше использовать 8 полей tinyint(1) или одно, но преобразовывать ее в двоичную систему исчисления.

 

Для запросов лучше 8 отдельных, чем одно комбинированое :D запаришься потом через время в своем же коде разбираться

Ссылка на комментарий
Поделиться на других сайтах

А... у меня в книге просто написано, что "tinyint(1)" имеет синонимы "INT1", "BIT" и "BOOL". :D И в IPB используют для таких полей tinyint (1)

 

Да там впринципе и Enum, и tinyint по одному байту...

 

Так вот думаю - тут же будет 1 байт на строку, а так 8 байт... ;)

 

А если мне таких флажков еще в пару раз больше?

Ссылка на комментарий
Поделиться на других сайтах

Имхо, что enum('0','1'), что tinyint(1) - в данном случае без разницы с точки зрения хранения данных.

 

Если полей таких немного (вернее, не очень много) - я бы делала отдельные поля. Быстрее будет выборка идти, код писать проще.

Если их уже очень много, вот тогда, возможно, заморачиваться с объединенным полем... Хотя, опять же, я, наверное, скорее сделала бы отдельную таблицу, типа member_extra.

Ссылка на комментарий
Поделиться на других сайтах

Насчитал 16 (+/-2) полей!

 

Дык, CHAR(8), 8 tinyint'ов - это все по 8 байт будет! В данном случае уже 16 байт на строку.

 

Можно использовать smallint (2 байта)

 

А для быстрой проверки отмечен ли где флажок можно использовать побитые операции, более того битовые опреации можно делать в запросе к SQL (чтобы определить сразу кто какой флажок включил)

 

SELECT *
FROM `test` WHERE number [b]&[/b] 1 = 1

 

Надо только запомнить что на какой позиции. Применять побитовую операцию & к этому полю вместе с нужной степенью 2.

Ссылка на комментарий
Поделиться на других сайтах

Так это только пару раз в жизни такой запрос проделать прийдется. Не часто мне захочется узнавать сколько человек включили какую-то конкретную настройку.
Ссылка на комментарий
Поделиться на других сайтах

Хм, а установка этой настройки на что-то будет влиять?

Движок тоже ведь должен запрашивать, включена ли настройка или нет...

Ссылка на комментарий
Поделиться на других сайтах

Ну, если есть у нас это число и чтобы проверить установлено ли на флажок "да" - надо применить $переменная*степень_2!=0, т.к. степени 2 имеют только одну 1, то если на нужной позиции не будет 1 - результат операции будет 0. Циклом можно пройтись по всем флажкам и создать масив 0 и 1. Да вообще можно сразу в if который проверяет эту настройку добавить.

 

А чтобы преобразовывать в настройках надо эти флажки (наборы 0 и 1) преобразовывать в сумму степеней 2 (умноженное на 0 или 1). В общем простым циклом :D.

 

Если мы захотим всем пользователям поставить например третий флажок значением 0, то применяем

 

UPDATE test SET number=number&11111011

 

только 11111011 надо перевести в 10-ную систему исчисления ;).

Ссылка на комментарий
Поделиться на других сайтах

Да, и битовые операции выполняются в один такт (как прибавление).

 

ИМХО, это все равно что сделать запрос увеличения всем пользователям количество постов на 1.

Ссылка на комментарий
Поделиться на других сайтах

А еще сдвиговые+битовые операции гораздо быстрее чем умножение стандартной инструкцией mul, раз в 7... На 8086 :D
Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...

Ага! А компилятор PHP переделывает автоматически $a*=2; в $a<<=1;?

 

P.S.: можете посмотреть что получилось http://www.harrypotter.com.ua/settings_new.htm

P.P.S.: там один столбик INT для настроек отображения сообщений тем и ПМок ("отображать ли картинки" и инфа в левой колонке). Для остальных фичей - tinyint'ы.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.