Мой полный файл docker-compose.
version: '3.2'
services:
apache:
container_name: apache
build: .docker/apache/
restart: always
volumes:
- .:/var/www/html/app/
ports:
- 80:80
depends_on:
- php
- mysql
links:
- mysql:mysql
php:
container_name: php
build: .docker/php/
restart: always
volumes:
- .:/var/www/html/app/
working_dir: /var/www/html/app/
mysql:
container_name: mysql
image: mysql
restart: always
volumes:
- .docker/data/db:/var/lib/mysql
environment:
MYSQL_DATABASE: app
MYSQL_ROOT_PASSWORD: test
MYSQL_USER: test
MYSQL_PASSWORD: test
Из статьи в Википедии о ПУСТОМ УКАЗАТЕЛЕ:
Например, оператор Where или условный оператор могли бы сравнить значение столбца с константой. Часто неправильно предполагается, что отсутствующее значение было бы "меньше, чем" или "не равный" константе, если то поле содержит Пустой указатель, но, на самом деле, такой Неизвестный возврат выражений. Пример ниже:
-- Rows where num is NULL will not be returned, -- contrary to many users' expectations. SELECT * FROM sometable WHERE num <> 1;
В основном любое сравнение между ПУСТЫМ УКАЗАТЕЛЕМ и что-то еще, является ли это с = или <>, не будет верно.
Как другая ссылка, страница MSDN T-SQL на <>
состояния:
Сравнивает два выражения (оператор сравнения). При сравнении непустых выражений результатом является TRUE, если левый операнд не равен правильному операнду; иначе результатом является ЛОЖЬ. Если или или оба операнда являются ПУСТЫМИ, посмотрите SET ANSI_NULLS (Transact-SQL).
Страница SET ANSI_NULLS затем указывает:
Когда SET ANSI_NULLS идет, оператор SELECT, который использует, КУДА column_name = ПУСТОЙ УКАЗАТЕЛЬ возвращает нулевые строки, даже если существуют нулевые значения в column_name. Оператор SELECT, который использует, КУДА column_name <> ПУСТОЙ УКАЗАТЕЛЬ возвращает нулевые строки, даже если существуют непустые значения в column_name.
...
Когда SET ANSI_NULLS идет, все сравнения с нулевым значением оценивают к НЕИЗВЕСТНОМУ. Когда SET ANSI_NULLS ВЫКЛЮЧЕН, сравнения всех данных против нулевого значения оценивают к TRUE, если значение данных является ПУСТЫМ.
Много хороших ответов, но позволяют мне дать Вам действительно краткую версию.
К SQL Пустой указатель НЕ означает "Значения", это означает "Неизвестное Значение"
Имея это в виду, рассмотрите ответ на вопрос, Вы спрашиваете SQL без обиняков.
Q: Is this unknown value not equal to 1?
A: I don't know, there is no way to tell without knowing the value.
Hence Null<>1 = Null
Другие люди корректны это NULL <> 1
не оценивает как верный, поэтому это не удовлетворяет WHERE
пункт.
Предложенная фиксация, которую Вы описываете, является лучшим способом обработать его:
(VoidedIndicator <> 1 OR VoidedIndicator IS NULL)
SQL-99 действительно имеет предикат, который помогает в этом случае, названный IS DISTINCT FROM
:
(VoidedIndicator IS DISTINCT FROM 1)
Этот предикат вел бы себя точно то же как Ваша предложенная фиксация. К сожалению, Microsoft SQL Server не поддерживает IS DISTINCT FROM
все же.
Это не ошибка.
ПУСТОЙ УКАЗАТЕЛЬ ничему не равен, даже ПУСТОЙ УКАЗАТЕЛЬ (ПУСТОЙ УКАЗАТЕЛЬ =, ПУСТОЙ УКАЗАТЕЛЬ возвращает FALSE).
Обычно Нулевые значения не индексируются также. Это обычно - плохая идея полагаться на конкретное значение или ПУСТОЙ УКАЗАТЕЛЬ. В зависимости от того, что Вы храните в столбце, можно быть более обеспеченным помещением макета или значения сигнальной метки во вместо того, чтобы использовать ПУСТОЙ УКАЗАТЕЛЬ для указания на некоторое значение.
Поскольку оператор Where только выбирает строки, когда условие оценивает к истинному.
Когда один из операндов является ПУСТЫМ, условие обычно оценивает к НЕИЗВЕСТНОМУ (приблизительно эквивалентный ПУСТОМУ УКАЗАТЕЛЮ) и поэтому не верно. Это относится к обоим'column = 1
'и'column <> 1
'; если столбец является ПУСТЫМ, сбои условия поиска.
Это - почему Вам говорят избежать столбцов NULL, когда это возможно.
ПУСТОЙ УКАЗАТЕЛЬ <> 1 оценивает (теоретически) к, "возможно", что означает, что запись не будет возвращена.