|
|
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
Привет, народ! Не могу разобраться с пустыми значениями.... Пример: Создаем таблицу и вставляем в нее одну строчку: Код: sql 1. 2. Выполняем запрос Код: sql 1. 2. 3. Результат - одна строка с значением поля ddd = 0 Получается что ifnull считает значение поля "d" НЕ равным NULL (хотя это поле пустое - там нет никаких данных), а условие where d is null считает что это поле РАВНО NULL ! Что это за хрень такая? И какое же значение содержится в этом поле??? Мало того, пишем второй запрос: Код: sql 1. 2. 3. Результат - ни одной строки, зато если условие where c is null убрать, то получаем одну строку с пустым полем "c" получается, что в этом случае и ifnull и условие where c is null считают это поле не равным NULL (хотя мы туда ничего не писали) Проясните мне пожалуйста эту свистопляску с трактовкой пустых значений в MySql... Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 12:45:12 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
SQL-TalkerСоздаем таблицу и вставляем в нее одну строчку: Код: sql 1. 2. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 12:56:55 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
И вообще это Код: sql 1. никак не стыкуется вот с этим: SQL-TalkerВыполняем запрос Код: sql 1. 2. 3. Результат - одна строка с значением поля ddd = 0 Так что не морочьте людям голову, а показывайте реально работающий пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 12:59:59 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
tanglir, Никто голову не морочит. Только что в HeidiSQL выполнил: Код: sql 1. 2. 3. При этом выдалось предупреждение (см. картинку), но все нормально - таблица дропнулась, заново создалась и вставилась строка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 14:27:37 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
На всякий случай проделал тоже самое в SQLyog, на случай если вдруг Heidi чудит, но нет - все точно так же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 14:32:18 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
Если это вдруг имеет значение, версия MySql - 5.5.25, ENGINE=InnoDB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 14:36:27 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, мой 5.0 сказал "низя". Наверное, у вас какая-то настройка (типа "skip-default-check") включена. И таки покажите, что в итоге лежит в полях "c" и "d" в этой таинственной строке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 14:51:14 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
SQL-Talker Код: sql 1. Код: sql 1. ddd = 0А чего же вы хотели? Сначала вставляете в поле дату '0000-00-00', потом приводите ее к целом числу и удивляетесь, что там 0 ? Читайте в доке MySQL о значениях по умолчанию для разных типов данных и преобразованиях типов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 14:54:00 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
tanglirмой 5.0 сказал "низя"надо SQL_MODE смотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 14:54:40 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
tanglirИ таки покажите, что в итоге лежит в полях "c" и "d" в этой таинственной строке. Мне самому интересно. Собственно об этом нулевой пост. Что там может быть, если я встваляю строку командой: Код: sql 1. И почему так по-разному и по-странному ведут себя те два запроса? Вот настройки 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:02:19 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
miksoftСначала вставляете в поле дату '0000-00-00', потом приводите ее к целом числу и удивляетесь, что там 0? Нет, я не нулю удивляюсь, а тому, что ifnull считает значение поля "d" НЕ равным NULL (хотя это поле пустое - там нет никаких данных), а условие where d is null считает что это поле РАВНО NULL miksoftЧитайте в доке MySQL о значениях по умолчанию для разных типов данных и преобразованиях типов. хм.. а ссылочку, если не сложно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:06:26 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
SQL-Talkerхм.. а ссылочку, если не сложно? http://dev.mysql.com/doc/refman/5.5/en/data-type-defaults.html http://dev.mysql.com/doc/refman/5.5/en/datetime.html http://dev.mysql.com/doc/refman/5.5/en/type-conversion.html http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:11:12 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
miksoft, Спасибо. И можно ли как-то узнать, что же именно находится в тех полях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:13:36 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
SQL-TalkerИ можно ли как-то узнать, что же именно находится в тех полях?Выполнить SELECT * FROM a_test ? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:18:00 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
miksoft, Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:24:58 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
как это трактовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:25:44 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
Пока экспериментировал по этому вопросу, обнаружил багофичу на sqlfiddle.com :) http://sqlfiddle.com/#!2/09d60/3 Value '0000-00-00' can not be represented as java.sql.Date: SELECT * FROM a_test ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:30:08 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
Да, эффект присутствует. Код: sql 1. 2. 3. Выдает одну запись с числом 0. http://sqlfiddle.com/#!2/09d60/9 Предполагаю, что это связано с нестандартным физически хранением даты в таком случае. А разные проверки по разному трактуют содержимое. Категорически не советую использовать этот эффект в продакшн-запросах и/или полагаться на неявное преобразование типов и неявные значения по-умолчанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:34:42 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
Понимаете в чем дело, у меня этот вопрос возник из-за того что я обнаружил, что сравнение с NULL не всегда работает в моих запросах. Вообще я до сих пор работал исключительно с ORACLE а там нет никаких вариантов - если поле пустое, значит NULL и соответственно сравнения с NULL и функции проверки на NULL - nvl(), nvl2() - работают одинаково и предсказуемо. Тут же я столкнулся с таким что на глаз вроде значение пустое, а проверку на NULL не проходит. Т.е. получается, например для стоковых типов, я должен в разделе WHERE делать сравнение с NULL и тут же сравнение с пустой строкой('') И тоже самое в разделе SELECT - применять ifnull() и тут же делать что-то типа if value='' ... Вот собственно этим и вызван этот пост. Т.е. хочу прояснить для себя какие мне сделует применять функции, проверки, сравнения, чтобы гарантировано быть уверенным, что значение в поле не пустое, не null и т.п., а заполнено осмысленным содержимым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:47:04 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, MySQL местами дает больше вольностей (например, позволяет хранить "нулевую" дату), что на практике чаще выходит боком, нежели приносит пользу. Рекомендую почитать про SQL Mode и использовать самый жесткий режим, какой возможно. Тогда таких сюрпризов будет меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:52:31 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
SQL-TalkerТ.е. хочу прояснить для себя какие мне сделует применять функции, проверки, сравнения, чтобы гарантировано быть уверенным, что значение в поле не пустое, не null и т.п., а заполнено осмысленным содержимым.Для этого нужно вставлять осмысленное содержимое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 15:53:17 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
miksoftSQL-TalkerТ.е. хочу прояснить для себя какие мне сделует применять функции, проверки, сравнения, чтобы гарантировано быть уверенным, что значение в поле не пустое, не null и т.п., а заполнено осмысленным содержимым.Для этого нужно вставлять осмысленное содержимое. Ну, я, так сказать, "по наследству" от уволившегося программиста получил прикладуху с большим объемом данных в MySQL. Иногда отчеты показывают бред, хотя вроде как запросы корректные. Насколько я успел разобраться все упирается именно в эти проверки. Вот только что правил один отчет, там была проверка на IS NOT NULL и работал отчет на некоторые даты неверно. После того как я добавил проверку value <> '' сразу все заработало. Я пытаюсь для себя прояснить, может этого не достаточно и нужно еще какие-то проверки на пустоту поля добавлять? И я так понимаю что с разными типами данных могут быть разные проверки (например с датой нужно сравнивать на null и на равенство '0000-00-00') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 16:05:16 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
SQL-Talker, я бы в таком случае отключил бы NOT NULL у этого поля и зачистил все '0000-00-00' в NULL. если, конечно, '0000-00-00' не представляет из себя какое-то специальное значение с точки зрения бизнес-задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 16:08:36 |
|
||
|
Типы ПУСТЫХ значений... Не могу понять что за хрень.....
|
|||
|---|---|---|---|
|
#18+
miksoft, Это будет решением в данном конкретном, частном случае и не будет являться универсальным лекарством. Нет же гарантии от появления в будущем записей с "неверными" пустыми значениями. Все-таки, надо бы к запросам прикручивать все возможные проверки значения на пустоту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2014, 16:16:12 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38543418&tid=1835313]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
56ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 356ms |

| 0 / 0 |
