2013-08-07 3 views
0

Что именно делает параметр в типе данных столбца? По существу:MySQL TINYINT (1) to BOOL

Я попробовал TINYINT (1), и казалось, что он содержит только 1 или 0. Почему он не отображает/хранит как минимум 0-9?

Редактировать: выясняется, что проблема не была проблемой MySQL, но была довольно неожиданным поведением CakePHP. Прочтите мой ответ для деталей. Я сохранил свой первоначальный вопрос ниже, поэтому полезные ответы сохраняют смысл.


Что я сделал:

Я создал таблицу MySQL с помощью команды

CREATE TABLE table_name (
    ... irrelevant columns 
    transaction_type TINYINT(1) NOT NULL COMMENT 'identifier from 0-5 (for now)' 
); 

и быстро стал полностью смущен, потому что я был не в состоянии хранить, отличных от 0 и 1 значений в столбце transaction_type.

После некоторого исследования я довольно уверенно определил, что параметр TINYINT (или любой другой целочисленный тип данных) является не более чем шириной отображения в символах. Я понял, что это означает две вещи:

  • Он должен еще сохранить весь вставленный значение, если оно находится в пределах TinyInt в
  • Он будет отображать только один символ, так что я должен быть в состоянии видеть значения 0 -9, когда я выбираю из таблицы.

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

тогда я попробовал:

ALTER TABLE table_name CHANGE transaction_type transaction_type TINYINT; 

и я внезапно смог вставить любое значение, я хотел. Однако, несмотря на то, что приведенная выше команда изменила всю таблицу, предыдущие вставки все еще имели значение 1, что вызывало подозрение, что они действительно были сохранены как 1.

Я не понимаю ширину экрана, или я делаю что-то совсем не так ?

Кроме того: если мне не все равно, как выглядят целые столбцы в таблице, есть ли какая-либо причина когда-либо поставить параметр с параметром? то есть INT (11) как-то лучше, чем INT?

Аналогичный вопрос, который, вероятно, должен был быть более полезным для меня: MySql: Tinyint (2) vs tinyint(1) - what is the difference?

Ярчайший источник, который я мог бы найти объясняющую ширину экрана: http://matt.thomm.es/archive/2006/11/28/mysql-integer-columns-and-display-width

ответ

3

Получается, что CakePHP предполагает, что TINYINT (1) должен быть булевым, потому что MySQL псевдонимы BOOL для TINYINT (1). Таким образом, любые «истинные» значения (например, значения, превышающие единицу) присваиваются единице, а любые «ложные» значения равны нулю.

Предупреждение для утомленных пассажиров: при использовании TINYINT (1) CakePHP может изменять ваши значения без предупреждения.

Старый CakePHP ошибка here

3

Вкратце: Это зависит только от того, насколько целое число заполняется нулем, если ZEROFILL включен в столбце.


Longer объяснение:

Длина целого числа в SQL не изменяет числа он держит (а TINYINT проведет -128 до 127, но без знака TINYINT проведет 0-255 и т.д. независимо от длины.)

Мне очень нравится MySQL Cheat Sheet для проверки размеров.

В настоящее время - что является фактическим разница между INT и INT(3)? Это просто. Если включено ZEROFILL, целое число будет равно нулю с этой длиной. Это единственное различие.

Есть хорошая статья, объясняющая это here.

В частности, копируется из article (проверить это получить ему несколько просмотров страниц!)

mysql> select * from b; 
+-------+ | b  | 
+-------+ | 10000 | 
+-------+ 1 row in set (0.00 sec)  

mysql> alter table b change b b int(11) zerofill; 
Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0  

mysql> select * from b; 
+-------------+ | b   | 
+-------------+ | 00000010000 | 
+-------------+ 1 row in set (0.00 sec) 
+0

Очень полезно - но вы можете думать о какой-либо причине, что он не будет ничего, кроме 0 или 1 магазин? Я думаю, что zerofill не изменил бы такого поведения – vroomfondel

+0

+1 для супер полезных ссылок, но я не думаю, что вы вполне отвечаете мясу моего вопроса – vroomfondel

-1

Число в скобках после TINYINT используется только для отображения - это не имеет ничего общего с количество байтов, которое MySQL использует для хранения значения в этом поле, и не имеет никакого отношения к диапазону значений в этом поле. Число в скобках просто используется, чтобы указать, сколько цифр будет отображаться в этом поле при запуске запросов с использованием клиента MySQL.

Смежные вопросы