Столбец TINYINT и использование в предложении Where - неожиданное поведение - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу иметь элемент управления, чтобы временно скрывать некоторые продукты на веб-сайте.Я думал, что легче внести изменения в базу данных, чем изменить sql и загрузить страницу снова.

Я добавил новый столбец с помощью:

ALTER TABLE product ADD hide BINARY NULL;

Он создалTINYINT (1) столбец.Если я сделаю некоторые продукты 1 скрытыми, а затем снова выставлю некоторые из них 0, у меня будет таблица со столбцом скрытия, например:

*hide*
NULL
0
1

Когда я сделаю запрос по:

SELECT * FROM product WHERE hide <> 1;

показывает только 0, но не NULL.Когда я изменил столбец на BIT, он превратился в BIT (1), тот же запрос приводит к тому же.

Логически, если что-то определено как 0 или 1, другого варианта нет.Вот почему вы используете бинарный.Третий вариант не логичен.

Чтобы соответствовать определениям, единственный способ написать, как показано ниже?

SELECT * FROM product WHERE hide <> 1 OR hide IS NULL;

(с использованием MySQL 5.6.17)

Вопрос-2: Как вы временно скрываете товар?По-другому?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Я думаю, что MySQL будет искать строку, которая имеет значение сначала, а затем само значение, поэтому нулевое значение не будет показано.

Но если значение не указано, будет показана строка.

0 голосов
/ 13 декабря 2018

Поскольку продукт может быть либо скрытым, либо не скрытым, я бы предложил изменить определение поля и установить для него ограничение NOT NULL.

Как указано здесь :

Сначала удалите все текущие значения NULL:

UPDATE `product` SET `hide`=0 WHERE `hide` IS NULL

Затем обновите определение таблицы, чтобы запретить значения NULL:

ALTER TABLE `product` ALTER COLUMN `hide` TINYINT NOT NULL

Если,по какой-то причине вы действительно хотите сохранить значения NULL, вам нужно изменить свой запрос на вторую предоставленную вами версию.

При этом я бы не стал использовать подход с базой данных для «временного» скрытия.Для таких случаев, я думаю, было бы лучше скрыть продукты на уровне приложений.

...