MySQL: от логического значения до Tinyint (1) и обратно - PullRequest
1 голос
/ 05 октября 2019

Я не хочу быть разборчивым, но почему в тот момент, когда вы определяете столбец таблицы как логический, в следующий раз, когда вы пытаетесь вернуть структуру таблицы, она возвращается как tinyint (1)?

Так что длячто касается таблицы, созданной с помощью

CREATE TABLE IF NOT EXISTS `test` (
    `aField` BOOLEAN DEFAULT true
);

В тот момент, когда я пытаюсь получить ее структуру с

SHOW COLUMNS FROM test

, я получил

+--------+------------+------+-----+---------+-------+
| Field  | Type       | Null | Key | Default | Extra |
+--------+------------+------+-----+---------+-------+
| aField | tinyint(1) | YES  |     | 1       |       |
+--------+------------+------+-----+---------+-------+

У меня нет (большой) проблема с тем фактом, что логическое значение хранится как tinyint (1), но у меня есть проблема с тем фактом, что в тот момент, когда вы видите tinyint (1), вы не знаете, было ли оно изначально создано как логическое значение иликак крошечный int для хранения диапазона малых чисел . Я видел документацию MySQL (https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html) о том, что

BOOL, BOOLEAN Эти типы являются синонимами для TINYINT (1)

, но я не согласен с вышеизложеннымупомянутая проблема.

Можно ли выполнить какой-либо другой запрос, который вернет мне исходный (логический) тип поля?

1 Ответ

1 голос
/ 05 октября 2019

Нет, вы никак не можете отличить столбец, созданный как BOOLEAN, от столбца, созданного как TINYINT (1).

Тип BOOLEAN нигде не сохраняется. Это всего лишь псевдоним, который преобразуется в TINYINT (1) перед сохранением в базе данных. Вы не найдете упоминания BOOLEAN в метаданных для столбца.

Это похоже на сохранение целочисленного значения из выражения ABS(?). Вы не знаете, было ли исходное значение, переданное в ABS (), положительным или отрицательным, поскольку сохраняется только результат выражения ABS ().

Кстати, TINYINT (1) не означаетэто позволяет только небольшой диапазон номеров. Естественно думать, что (1) это ограничение размера, как для CHAR или DECIMAL. Но для целочисленных типов в MySQL это не влияет на размер типа данных или диапазон значений, которые он принимает. TINYINT всегда является 8-разрядным целым числом и принимает значения от -128 до 127, или для TINYINT UNSIGNED он всегда принимает значения от 0 до 255.

См. Также мой ответ на https://stackoverflow.com/a/3135854/20860

...