Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Типы ПУСТЫХ значений... Не могу понять что за хрень..... / 25 сообщений из 25, страница 1 из 1
30.01.2014, 12:45:12
    #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
30.01.2014, 12:56:55
    #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
30.01.2014, 12:59:59
    #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
30.01.2014, 14:27:37
    #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
30.01.2014, 14:32:18
    #38543670
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
На всякий случай проделал тоже самое в SQLyog, на случай если вдруг Heidi чудит, но нет - все точно так же.
...
Рейтинг: 0 / 0
30.01.2014, 14:36:27
    #38543678
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
Если это вдруг имеет значение, версия MySql - 5.5.25, ENGINE=InnoDB
...
Рейтинг: 0 / 0
30.01.2014, 14:51:14
    #38543704
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
SQL-Talker, мой 5.0 сказал "низя". Наверное, у вас какая-то настройка (типа "skip-default-check") включена.
И таки покажите, что в итоге лежит в полях "c" и "d" в этой таинственной строке.
...
Рейтинг: 0 / 0
30.01.2014, 14:54:00
    #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
30.01.2014, 14:54:40
    #38543716
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
tanglirмой 5.0 сказал "низя"надо SQL_MODE смотреть.
...
Рейтинг: 0 / 0
30.01.2014, 15:02:19
    #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
30.01.2014, 15:06:26
    #38543736
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
miksoftСначала вставляете в поле дату '0000-00-00', потом приводите ее к целом числу и удивляетесь, что там 0?
Нет, я не нулю удивляюсь, а тому, что ifnull считает значение поля "d" НЕ равным NULL (хотя это поле пустое - там нет никаких данных), а условие where d is null считает что это поле РАВНО NULL

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

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

Код: sql
1.
2.
3.
    id  c       d         
------  ------  ----------
   987          0000-00-00
...
Рейтинг: 0 / 0
30.01.2014, 15:25:44
    #38543781
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
как это трактовать?
...
Рейтинг: 0 / 0
30.01.2014, 15:30:08
    #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
30.01.2014, 15:34:42
    #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
30.01.2014, 15:47:04
    #38543821
SQL-Talker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
Понимаете в чем дело, у меня этот вопрос возник из-за того что я обнаружил, что сравнение с NULL не всегда работает в моих запросах.
Вообще я до сих пор работал исключительно с ORACLE а там нет никаких вариантов - если поле пустое, значит NULL и соответственно сравнения с NULL и функции проверки на NULL - nvl(), nvl2() - работают одинаково и предсказуемо.
Тут же я столкнулся с таким что на глаз вроде значение пустое, а проверку на NULL не проходит.
Т.е. получается, например для стоковых типов, я должен в разделе WHERE делать сравнение с NULL и тут же сравнение с пустой строкой('')
И тоже самое в разделе SELECT - применять ifnull() и тут же делать что-то типа if value='' ...

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

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

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

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

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


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