Значение MySQL tinyint автоматически преобразуется в Boolean [duplicate]

Единственное решение, которое работает во всех случаях, которые я видел, - это удаление и повторное использование. Может быть, есть и другой способ, но, очевидно, этот путь не оставляет шансов на то, что старое государство останется там, поэтому я предпочитаю это. Bash one-liner вы можете установить как макрос, если вы часто испортите вещи в git:

REPO_PATH=$(pwd) && GIT_URL=$(git config --get remote.origin.url) && cd .. && rm -rf $REPO_PATH && git clone --recursive $GIT_URL $REPO_PATH && cd $REPO_PATH

* предполагает, что ваши .git-файлы не повреждены

71
задан S.L. Barth 31 July 2012 в 14:31
поделиться

5 ответов

У MySQL нет внутреннего типа данных типа boolean. Он использует наименьший целочисленный тип данных - TINYINT.

BOOLEAN и BOOL являются эквивалентами TINYINT (1), поскольку они являются синонимами.

Попробуйте создать эту таблицу -

CREATE TABLE table1 (
  column1 BOOLEAN DEFAULT NULL
);

Затем запустите SHOW CREATE TABLE, вы получите этот выход -

CREATE TABLE `table1` (
  `column1` tinyint(1) DEFAULT NULL
)
105
ответ дан khaverim 18 August 2018 в 07:01
поделиться
  • 1
    Существует BIT – ypercubeᵀᴹ 23 June 2012 в 09:10
  • 2
    Кажется, что это сделано для обратной совместимости. Тип данных BOOLEAN был до MySQL 5 и не был оптимизирован тип BIT, это также был TINYINT. Из документации - Новые функции, запланированные для 5.1: Оптимизируйте тип BIT, чтобы взять один бит. (BIT теперь принимает один байт, он рассматривается как синоним TINYINT.). – Devart 23 June 2012 в 09:24
  • 3
    Да, вы можете знать, есть ли BIT(1) или BIT(17) или даже BIT(64) – ypercubeᵀᴹ 23 June 2012 в 09:25
  • 4
    @Devart. Если ваш ответ имеет наибольшее количество голосов и появляется первым (в моем списке так или иначе), и прошло какое-то время, есть ли шанс, что вы захотите добавить свой ответ, чтобы включить некоторое обсуждение типа BIT в MySQL 5.1 и позже? – Jonathan 11 December 2016 в 10:34
  • 5
    @Jonathan Возможно, упоминание о том, что это ценно, однако BIT (1) на самом деле не использует меньшее пространство, чем TINYINT (1), и не отображается, поскольку большинство людей ожидали бы при использовании стандартной консоли mysql. Из-за этого недостатка и отсутствия преимуществ для хранения, просто использование TINYINT (1) или BOOLEAN, по-видимому, является самым распространенным в моем опыте. – Tyler Smith 29 April 2017 в 21:57

Начиная с версии MySql 5.1 reference

BIT(M) =  approximately (M+7)/8 bytes, 
BIT(1) =  (1+7)/8 = 1 bytes (8 bits)

======================== =================================================

TINYINT(1) take 8 bits.

https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html#data-types-storage-reqs-numeric

7
ответ дан fortune 18 August 2018 в 07:01
поделиться
  • 1
    Ваша ссылка говорит, что требуемое хранилище фактически «приблизительно» (M + 7) / 8 байтов ». то есть округляется до следующего полного байта. Таким образом, не принимает 1 бит. – mpen 15 May 2017 в 23:42
  • 2
    @mpen tnx, я обновил ответ. – fortune 16 May 2017 в 07:05

Обзор числового типа для MySQL: BOOL, BOOLEAN: Эти типы являются синонимами для TINYINT (1). Значение нуля считается ложным. Ненулевые значения считаются истинными.

См. Здесь: https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html

0
ответ дан Patrik Rikama-Hinnenberg 18 August 2018 в 07:01
поделиться

В новейших версиях MySQL есть новый тип данных BIT, в котором вы можете указать количество бит в поле, например BIT(1) для использования в качестве типа Boolean, поскольку оно может быть только 0 или 1.

22
ответ дан PSyLoCKe 18 August 2018 в 07:01
поделиться

Просто примечание для разработчиков php (у меня нет необходимых точек stackoverflow, чтобы опубликовать это как комментарий) ... автоматическое (и молчащее) преобразование в TINYINT означает, что php получает значение из столбца BOOLEAN как " 0 "или" 1 ", а не ожидаемый (по мне) true / false.

Разработчик, который смотрит на SQL, используемый для создания таблицы, и видит что-то вроде:" some_boolean BOOLEAN NOT NULL DEFAULT FALSE , «может разумно ожидать увидеть истинные / ложные результаты, когда извлекается строка, содержащая этот столбец. Вместо этого (по крайней мере, в моей версии PHP) результат будет «0» или «1» (да, строка «0» или строка «1», а не int 0/1, спасибо php).

Это нит, но достаточно, чтобы вызвать единичные тесты.

26
ответ дан Tom Stambaugh 18 August 2018 в 07:01
поделиться
  • 1
    В качестве дополнительной заметки, PHP-драйверы mysql вытягивают все целые типы в виде строк. – kojow7 12 July 2017 в 03:59
Другие вопросы по тегам:

Похожие вопросы: