MySQL типы данных Boolean и TINYINT(1)

Тема в разделе "Базы данных", создана пользователем jabbaxatt, 3 июл 2013.

Статус темы:
Закрыта.
Модераторы: latteo
  1. jabbaxatt

    jabbaxatt Добрый модератор

    Moderator
    Регистр.:
    21 янв 2009
    Сообщения:
    878
    Симпатии:
    411
    Какой тип данных правильно задавать в базе MySQL (и\или MariaDB) для хранения логического типа данных?

    Чтобы и места меньше (хотя вроде Boolean и TINYINT(1) занимают одинаково места) и выборки для определения числа записей с параметром True\Falze были максимально быстрыми.

    В интернете пришут "Тип BOOLEAN это аналог TINYINT(1). Значение 1 это истина (true), значение 0 ложь (false)."

    Но как всегда - хочу проверить и уточнить.
     
  2. leha706

    leha706 Постоялец

    Регистр.:
    6 мар 2013
    Сообщения:
    92
    Симпатии:
    32
    Я всегда пользуюсь 0 и 1, но только потому, что пишется одним знаком, а не 4-5. Не уверен, что будет разница в скорости запроса, в двоичном коде вроде разницы нет.
     
  3. jabbaxatt

    jabbaxatt Добрый модератор

    Moderator
    Регистр.:
    21 янв 2009
    Сообщения:
    878
    Симпатии:
    411
    Т.е.
    Код:
    CREATE TABLE `tablename` (
      `TINYIN` tinyint(1) default NULL,
    
    - так правильно? Вроде в Интернете тоже пишут что так и надо использовать.
     
  4. leha706

    leha706 Постоялец

    Регистр.:
    6 мар 2013
    Сообщения:
    92
    Симпатии:
    32
    или так:`название поля` int(1) default NULL, я обычно через php-admin создаю таблицы, там только выбрать из предложенных вариантов тип поля и значение по умолчанию и в синтаксисе не ошибешься.
     
  5. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.035
    Симпатии:
    2.034
    Для таких данных есть вариант использовать ENUM и SET, но особого смысла нет. TINYINT(1) вполне справляется с такой задачей, но, лучше, использовать не 0 и 1, а 1 и NULL. Тогда Проверка if ($a) будет работать корректно и не потребуется использовать == 1 и т.д.

    И да, правильный выбор типа данных - далеко не определяет скорость работы этой таблицы. Грамотные индексы решают. (индексом должно быть всё, что используется для WHERE)
     
    scarm и jabbaxatt нравится это.
  6. NoName999

    NoName999 Создатель

    Регистр.:
    27 июн 2013
    Сообщения:
    14
    Симпатии:
    5
    Так повелось, что boolean в проектах я не использую обычно. Одна из причин, например, для большей гибкости и совместимости между разными СУБД. Например, в том же Oracle SQL нету логического типа (Boolean). Видется мне, что это не престо так.
    Мне кажется, что лучше все же явно инициализировать нулем по умолчанию, потому что по-честному получается трехзначная логика правда/ложь/неопределенно. В текущей спецификации MySQL NULL и 0 одно и то же, но если в какой-то момент это станет не так, то на обнаружение и устранение этого уйдет прилично трудочасов.
     
    Шумадан нравится это.
  7. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.035
    Симпатии:
    2.034
    NULL и 0 не одно и тоже - это надо помнить... NULL - ТЕКСТОВАЯ строка нулевой длинны, 0 же - цифра. Их значения в некоторых случаях приравнено, но типы данных разные!
     
    Шумадан нравится это.
  8. Bezhev

    Bezhev

    Регистр.:
    26 дек 2012
    Сообщения:
    362
    Симпатии:
    123
    На всех проектах используем tinyint и соответственно храним всегда 0 и 1. Как писали, из-за кол-ва символов :)
     
Статус темы:
Закрыта.