powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Типы ПУСТЫХ значений... Не могу понять что за хрень.....
25 сообщений из 25, страница 1 из 1
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543418
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, народ!

Не могу разобраться с пустыми значениями....
Пример:
Создаем таблицу и вставляем в нее одну строчку:
Код: sql
1.
2.
CREATE TABLE a_test (id INT NOT NULL, c VARCHAR(10) NOT NULL, d DATE NOT NULL);
INSERT INTO a_test (id) VALUES (123);



Выполняем запрос
Код: sql
1.
2.
3.
select ifnull(cast(d as signed), -1) ddd
from a_test t
where d is null


Результат - одна строка с значением поля ddd = 0
Получается что ifnull считает значение поля "d" НЕ равным NULL (хотя это поле пустое - там нет никаких данных), а условие where d is null считает что это поле РАВНО NULL !
Что это за хрень такая? И какое же значение содержится в этом поле???


Мало того, пишем второй запрос:
Код: sql
1.
2.
3.
select ifnull(c, 'is null') ccc
from a_test t
where c is null


Результат - ни одной строки, зато если условие where c is null убрать, то получаем одну строку с пустым полем "c"
получается, что в этом случае и ifnull и условие where c is null считают это поле не равным NULL (хотя мы туда ничего не писали)

Проясните мне пожалуйста эту свистопляску с трактовкой пустых значений в MySql...

Спасибо!
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543453
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-TalkerСоздаем таблицу и вставляем в нее одну строчку:
Код: sql
1.
2.
CREATE TABLE a_test (id INT NOT NULL, c VARCHAR(10) NOT NULL, d DATE NOT NULL);
INSERT INTO a_test (id) VALUES (123);

Код: plaintext
SQL Error (1364): Field 'c' doesn't have a default value
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543463
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще это
Код: sql
1.
d DATE NOT NULL

никак не стыкуется вот с этим:
SQL-TalkerВыполняем запрос
Код: sql
1.
2.
3.
select ifnull(cast(d as signed), -1) ddd
from a_test t
where d is null



Результат - одна строка с значением поля ddd = 0

Так что не морочьте людям голову, а показывайте реально работающий пример.
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543663
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir,

Никто голову не морочит. Только что в HeidiSQL выполнил:
Код: sql
1.
2.
3.
DROP TABLE a_test;
CREATE TABLE a_test (id INT NOT NULL, c VARCHAR(10) NOT NULL, d DATE NOT NULL);
INSERT INTO a_test (id) VALUES (987);


При этом выдалось предупреждение (см. картинку), но все нормально - таблица дропнулась, заново создалась и вставилась строка
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543670
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всякий случай проделал тоже самое в SQLyog, на случай если вдруг Heidi чудит, но нет - все точно так же.
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543678
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это вдруг имеет значение, версия MySql - 5.5.25, ENGINE=InnoDB
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543704
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker, мой 5.0 сказал "низя". Наверное, у вас какая-то настройка (типа "skip-default-check") включена.
И таки покажите, что в итоге лежит в полях "c" и "d" в этой таинственной строке.
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543714
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker
Код: sql
1.
d DATE NOT NULL

Код: sql
1.
cast(d as signed) ddd

ddd = 0А чего же вы хотели?
Сначала вставляете в поле дату '0000-00-00', потом приводите ее к целом числу и удивляетесь, что там 0 ?
Читайте в доке MySQL о значениях по умолчанию для разных типов данных и преобразованиях типов.
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543716
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirмой 5.0 сказал "низя"надо SQL_MODE смотреть.
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543730
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirИ таки покажите, что в итоге лежит в полях "c" и "d" в этой таинственной строке.
Мне самому интересно. Собственно об этом нулевой пост.
Что там может быть, если я встваляю строку командой:
Код: sql
1.
INSERT INTO a_test (id) VALUES (123);


И почему так по-разному и по-странному ведут себя те два запроса?


Вот настройки MySQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
# The following options will be passed to all MySQL client.
[client]
port                  = 3306
socket                = /tmp/mysql5.sock
character-sets-dir    = /usr/local/mysql-5.5/share/charsets
default-character-set = cp1251

[mysqld]
character-set-server = utf8 
init-connect = "set names cp1251"
tmpdir = /tmp
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K
server-id   = 1

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M

[mysqlhotcopy]
interactive-timeout
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543736
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftСначала вставляете в поле дату '0000-00-00', потом приводите ее к целом числу и удивляетесь, что там 0?
Нет, я не нулю удивляюсь, а тому, что ifnull считает значение поля "d" НЕ равным NULL (хотя это поле пустое - там нет никаких данных), а условие where d is null считает что это поле РАВНО NULL

miksoftЧитайте в доке MySQL о значениях по умолчанию для разных типов данных и преобразованиях типов.
хм.. а ссылочку, если не сложно?
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543744
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543746
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Спасибо.
И можно ли как-то узнать, что же именно находится в тех полях?
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543755
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-TalkerИ можно ли как-то узнать, что же именно находится в тех полях?Выполнить SELECT * FROM a_test ? :)
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543777
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Код: sql
1.
2.
3.
    id  c       d         
------  ------  ----------
   987          0000-00-00
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543781
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как это трактовать?
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543789
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока экспериментировал по этому вопросу, обнаружил багофичу на sqlfiddle.com :)
http://sqlfiddle.com/#!2/09d60/3 Value '0000-00-00' can not be represented as java.sql.Date: SELECT * FROM a_test
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543800
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, эффект присутствует.
Код: sql
1.
2.
3.
SELECT d IS NULL
FROM a_test t
WHERE d IS NULL;

Выдает одну запись с числом 0.
http://sqlfiddle.com/#!2/09d60/9

Предполагаю, что это связано с нестандартным физически хранением даты в таком случае. А разные проверки по разному трактуют содержимое.

Категорически не советую использовать этот эффект в продакшн-запросах и/или полагаться на неявное преобразование типов и неявные значения по-умолчанию.
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543821
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понимаете в чем дело, у меня этот вопрос возник из-за того что я обнаружил, что сравнение с NULL не всегда работает в моих запросах.
Вообще я до сих пор работал исключительно с ORACLE а там нет никаких вариантов - если поле пустое, значит NULL и соответственно сравнения с NULL и функции проверки на NULL - nvl(), nvl2() - работают одинаково и предсказуемо.
Тут же я столкнулся с таким что на глаз вроде значение пустое, а проверку на NULL не проходит.
Т.е. получается, например для стоковых типов, я должен в разделе WHERE делать сравнение с NULL и тут же сравнение с пустой строкой('')
И тоже самое в разделе SELECT - применять ifnull() и тут же делать что-то типа if value='' ...

Вот собственно этим и вызван этот пост. Т.е. хочу прояснить для себя какие мне сделует применять функции, проверки, сравнения, чтобы гарантировано быть уверенным, что значение в поле не пустое, не null и т.п., а заполнено осмысленным содержимым.
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543827
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker,

MySQL местами дает больше вольностей (например, позволяет хранить "нулевую" дату), что на практике чаще выходит боком, нежели приносит пользу. Рекомендую почитать про SQL Mode и использовать самый жесткий режим, какой возможно. Тогда таких сюрпризов будет меньше.
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543829
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-TalkerТ.е. хочу прояснить для себя какие мне сделует применять функции, проверки, сравнения, чтобы гарантировано быть уверенным, что значение в поле не пустое, не null и т.п., а заполнено осмысленным содержимым.Для этого нужно вставлять осмысленное содержимое.
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543843
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftSQL-TalkerТ.е. хочу прояснить для себя какие мне сделует применять функции, проверки, сравнения, чтобы гарантировано быть уверенным, что значение в поле не пустое, не null и т.п., а заполнено осмысленным содержимым.Для этого нужно вставлять осмысленное содержимое.
Ну, я, так сказать, "по наследству" от уволившегося программиста получил прикладуху с большим объемом данных в MySQL. Иногда отчеты показывают бред, хотя вроде как запросы корректные. Насколько я успел разобраться все упирается именно в эти проверки. Вот только что правил один отчет, там была проверка на IS NOT NULL и работал отчет на некоторые даты неверно. После того как я добавил проверку value <> '' сразу все заработало.
Я пытаюсь для себя прояснить, может этого не достаточно и нужно еще какие-то проверки на пустоту поля добавлять?

И я так понимаю что с разными типами данных могут быть разные проверки (например с датой нужно сравнивать на null и на равенство '0000-00-00')
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543846
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-Talker,

я бы в таком случае отключил бы NOT NULL у этого поля и зачистил все '0000-00-00' в NULL.
если, конечно, '0000-00-00' не представляет из себя какое-то специальное значение с точки зрения бизнес-задачи.
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543855
SQL-Talker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Это будет решением в данном конкретном, частном случае и не будет являться универсальным лекарством. Нет же гарантии от появления в будущем записей с "неверными" пустыми значениями. Все-таки, надо бы к запросам прикручивать все возможные проверки значения на пустоту.
...
Рейтинг: 0 / 0
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
    #38543869
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL-TalkerНет же гарантии от появления в будущем записей с "неверными" пустыми значениями.Гарантии нет, но хотя бы будет честный NULL, а не черти-что.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Типы ПУСТЫХ значений... Не могу понять что за хрень.....
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]