Какой тип данных хранить только значения 0, 1, -1?

Я попытался создать поле со значениями TINYINT(1), NOT NULL и DEFAULT -1, чтобы указать «неизвестно», но получил от своего клиента следующую ошибку:

Ошибка при изменении MyTable: ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с '' в строке 1

Я также попытался сделать длину 2 и получил то же сообщение

Предположение, что TINYINT не является правильным типом данных для такого обозначения, но что?

РЕДАКТИРОВАТЬ: я заработал после прочтения комментария Эда Коттрелла. Я думаю, что где-то был лишний символ, вот выражение, которое сгенерировал мой клиент (использующий Querious для Mac):

ALTER TABLE `DBName`.`MyTable`
CHANGE COLUMN `MyColumn` `MyColumn` TINYINT(1) NOT NULL DEFAULT -1  COMMENT ''
AFTER `MyOtherColumn`;

Заметил, что COMMENT там и убедился, что все чисто.

Другие комментарии и ответы были оценены; В данном случае я решил, что NULL означает неизвестно.


person Drewdavid    schedule 07.11.2013    source источник
comment
Я считаю, что этот ответ будет работать для вас. stackoverflow.com/ вопросы/4401673/   -  person gpopoteur    schedule 08.11.2013
comment
Может быть, вам следует использовать поле, допускающее значение NULL, и установить null как неизвестно?   -  person MarcinJuraszek    schedule 08.11.2013
comment
Почему бы не позволить NULL представлять неизвестное?   -  person Chris Hayes    schedule 08.11.2013
comment
Это звучит как настоящая опечатка; Вы можете опубликовать полное заявление ALTER?   -  person elixenide    schedule 08.11.2013
comment
@EdCottrell Я добавил утверждение к вопросу, спасибо :)   -  person Drewdavid    schedule 08.11.2013
comment
Привет, Эд, ты был прав, каким-то образом туда попал какой-то комментарий.   -  person Drewdavid    schedule 08.11.2013


Ответы (1)


Я думаю, вы должны хранить это как бит (если вам важен размер хранилища), и пусть NULL означает «неизвестно».

field bit(1) default NULL,

Кажется странным объявлять поле равным not null, а затем иметь специальное значение, которое, по сути, означает NULL.

РЕДАКТИРОВАТЬ:

Следующий синтаксис «работает» на SQL Fiddle:

create table t (
  val int,
  flag tinyint(1) default -1
 );

«работает» в кавычках, потому что значение по умолчанию печатается как «1», а не как «-1» — в конце концов, (1) говорит, что нужно напечатать только одну цифру.

Возможно, в некоторых более ранних версиях MySQL он генерирует ошибку, когда видит, что -1 не будет отображаться правильно. (Честно говоря, меня бы это удивило.)

person Gordon Linoff    schedule 07.11.2013
comment
Кстати, я заметил, что вы не указали длину поля в поле BIT в своем заявлении, разве это не необходимо? Кроме того, я не думаю, что получу какую-либо экономию памяти, если это будет мой единственный столбец BIT (который находится в этой таблице); Я полагаю, что BIT занимает 1 байт для 8 столбцов, а TINYINT также занимает один байт, не так ли? Спасибо :) - person Drewdavid; 08.11.2013
comment
@Дрюдавид. . . Я добавил длину. Хотя MySQL принимает bit без длины, документация предполагает, что длина обязательна. - person Gordon Linoff; 08.11.2013
comment
tinyint(1) не ограничивает значения этого столбца одной цифрой. - person a_horse_with_no_name; 08.11.2013