metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2014-12-01 05:41 pm

mysql

Правильно ли я понимаю, что `created_on` datetime NOT NULL в создании таблицы mysql воспринимает чисто как рекомендацию, но вставлять null в такие поля разрешает?
Или это у меня просто руби и прочая кложурь падают от значения "00-00-0000 00:00:00" которое он туда по умолчанию впихивает при инсерте?

[identity profile] sergiej.livejournal.com 2014-12-01 02:52 pm (UTC)(link)

Null и ноль часов ноль минут в день начала нашей эры это две большие разницы :)

[identity profile] enternet.livejournal.com 2014-12-01 03:10 pm (UTC)(link)
Батенька, не могли бы вы при случае объяснить ораклистам что пустая строка и Null это две большие разницы? А то они не в курсе )

[identity profile] sergiej.livejournal.com 2014-12-01 03:14 pm (UTC)(link)
пост об mysql, аль оно уже ораклом стало?

[identity profile] enternet.livejournal.com 2014-12-01 03:25 pm (UTC)(link)
Это я хотел пошутить на тему "а вы уверены".

[identity profile] sergiej.livejournal.com 2014-12-01 03:27 pm (UTC)(link)
Не уверен, но в юношестве баловался mysql и прочими PHP
вот нашёл для проверки когда не налл, то он автоматом вставляет "дефолт", а для таймстемпа дефолт есть, вот поконкретнее:
"For date and time types other than TIMESTAMP, the default is the appropriate “zero” value for the type. This is also true for TIMESTAMP if the explicit_defaults_for_timestamp system variable is enabled "

[identity profile] metaclass.livejournal.com 2014-12-01 03:36 pm (UTC)(link)
Ясно, конченые содомиты.
Не говоря уже о том, что даты 00-00-0000 не бывает.

[identity profile] sergiej.livejournal.com 2014-12-01 03:37 pm (UTC)(link)
Ребе такое впечатление что вы в мир ПоХаПе не ходите :))

[identity profile] ynot.livejournal.com 2014-12-01 04:23 pm (UTC)(link)
Блажен муж, иже не иде на совет нечестивых!

[identity profile] hshhhhh.livejournal.com 2014-12-01 04:55 pm (UTC)(link)
почему даты 00-00-0000 не бывает?

[identity profile] nivanych.livejournal.com 2014-12-01 08:15 pm (UTC)(link)
Уже завтра!!

[identity profile] dj20a.livejournal.com 2014-12-02 06:56 am (UTC)(link)
ты очень плохой человек. ты подслущиваешь чужие разговоры, и я тебе за это разобью хлебало.

[identity profile] sigmaray.livejournal.com 2014-12-01 09:12 pm (UTC)(link)
Если я правильно понимаю, отсчёт времени начался с 01-01-0000 00:00:00. То что раньше - до рождества христова. А нулевых чисел и месяцев не бывает.

[identity profile] tzirechnoy.livejournal.com 2014-12-01 04:23 pm (UTC)(link)
Стало-стало, давно притом.

[identity profile] sergiej.livejournal.com 2014-12-01 05:18 pm (UTC)(link)
Круто! Только чота как был Mysql так и остался несовместим с Ораклом

[identity profile] molnij.livejournal.com 2014-12-03 06:39 pm (UTC)(link)
Честно говоря, поработав в оракле и в не-оракле, склонен считать, что оракл был прав, и идея объединения пустой строки и nullовой в реальности здравая, хотя и противоречит чистой теории в вакууме.
Хотя не исключаю, что это субьективное впечатление из-за моей чистой любви к ораклу.

[identity profile] juan-gandhi.livejournal.com 2014-12-01 04:36 pm (UTC)(link)
Пытаюсь переварить сообщение о том, что "руби и кложурь падают от значения "00-00-0000 00:00:00""

[identity profile] metaclass.livejournal.com 2014-12-01 04:53 pm (UTC)(link)
что-то вроде такого:
java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 6 to TIMESTAMP.
at com.mysql.jdbc.SQLError.createSQLException (SQLError.java:1055)

Ожидаемо, т.к. нулевых дней в месяце не бывает :)

а руби загружает это значение как nil и при попытке его показать на странице валится :)

[identity profile] sergiej.livejournal.com 2014-12-01 05:14 pm (UTC)(link)
кстати это пахнет багом Mysql. Раз они применяют такой дефолт, то должны его валидно и преобразовывать

[identity profile] metaclass.livejournal.com 2014-12-01 05:32 pm (UTC)(link)
Это драйвер жабий, а не mysql, кажется.

[identity profile] sergiej.livejournal.com 2014-12-01 05:45 pm (UTC)(link)
да пожалуй жаба

[identity profile] denisioru.livejournal.com 2014-12-01 06:53 pm (UTC)(link)
Прекрасный, яркий баг, могли бы и -1 использовать как отсутствие целочисленного значения. А что? В мире никто не использует -1, давайте его будем считать отсутствием значения.

Да, я в курсе про boolean в паскале.

[identity profile] sergiej.livejournal.com 2014-12-01 06:57 pm (UTC)(link)
ну судя по описанию это не отсутствие, а именно нулевая дата

[identity profile] metaclass.livejournal.com 2014-12-01 07:27 pm (UTC)(link)
Не, такой даты не может быть по определению.
Но оно же пытается ее создать :)

[identity profile] sergiej.livejournal.com 2014-12-01 07:29 pm (UTC)(link)
Ну дефолтную же можно другую попробовать проставить. Я думаю тут оно не на 000000 падает
хотя чего гадать на пальцах, можно инвестигейтить

[identity profile] volodymir-k.livejournal.com 2014-12-01 06:28 pm (UTC)(link)
ждбц драйвер для майскл должна писать, и пишет, команда майскл (теоретически она может и не быть в штате оракла)

что у них могут быть кривые руки, охотно верю

но вот как раз драйвер https://dev.mysql.com/downloads/connector/j/ гпл-ный, можете собственноручно фиксать баги

[identity profile] sergiej.livejournal.com 2014-12-01 06:59 pm (UTC)(link)
так к этому же наверняка привыкли и пользуются в мегатоннах кода. "Профиксай" такое и сотня систем ляжет

[identity profile] juan-gandhi.livejournal.com 2014-12-01 05:36 pm (UTC)(link)
Философски глядя, это херня.

Внешний мир может поставлять до хрена всякого мусора; надо не рыдать над несовершенством внешнего мира, а определять машину (т.е. алгебру) соответствующим образом.

[identity profile] metaclass.livejournal.com 2014-12-01 06:29 pm (UTC)(link)
Не, тут все от входа сломано, если основа основ, т.е. база данных, позволяет себе мало того, что создавать значения недопустимые типом (вставлять NULL в не-NULL поле), так еще и заменяет их на значения, в принципе недопустимые типом, который внутри Nullable[] живет.
Ну, ладно, для меня это система внешняя, я на границе от нее костыль поставлю, но все равно печально :)

[identity profile] sergiej.livejournal.com 2014-12-01 07:30 pm (UTC)(link)
оракл тоже умеет вставлять нулл не в нулл

[identity profile] juan-gandhi.livejournal.com 2014-12-01 09:05 pm (UTC)(link)
Это другое дело, печалиться от несовершенства мира. Мейер как раз и сказал, что куда ни кинь - везде монада (а чистоты нетути).

[identity profile] slonopotamus.livejournal.com 2014-12-01 05:00 pm (UTC)(link)
А, у вас наоборот. А что если сказать "timestamp not null default null"? Или "timestamp not null default current_timestamp"?

[identity profile] falcrum.livejournal.com 2014-12-01 06:27 pm (UTC)(link)
Вот, блин, теперь из-за тебя сижу и пытаюсь вспомнить, в какой БД null в date давал 30 декабря 1899 года...

[identity profile] metaclass.livejournal.com 2014-12-01 06:30 pm (UTC)(link)
Это в дельфи (и OLEDATE, кажется) так.

[identity profile] ext_1684112 (from livejournal.com) 2014-12-02 11:47 am (UTC)(link)
>30 декабря 1899 года

God save the Queen!

В то время она еще правила.

[identity profile] dmitry-vk.livejournal.com 2014-12-02 05:15 am (UTC)(link)
В mysql есть какой-то strict mode, в котором, кажется, такого не происходит.

[identity profile] dj20a.livejournal.com 2014-12-02 06:54 am (UTC)(link)
ты не не правильно понимаешь. ты шизофреник.

[identity profile] kamazee.livejournal.com 2014-12-06 11:07 pm (UTC)(link)
Что-то мне подсказывает, что драйвер передает какое-то значение, которое кастуется в 0000-00-00 00:00:00 (которое суть число ноль), но не null. По-моему, MySQL, несмотря на толпы тараканов в разных местах, ведет себя при записи datetime достаточно объяснимо (см. в особенности первую вставку):


$ mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 46673
Server version: 5.5.31-0+wheezy1 (Debian)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use test;
Database changed
mysql> create table metaclass (test_datetime datetime not null);
Query OK, 0 rows affected (0.34 sec)

mysql> insert into metaclass values (null);
ERROR 1048 (23000): Column 'test_datetime' cannot be null
mysql> insert into metaclass values ('');
Query OK, 1 row affected, 1 warning (0.09 sec)

mysql> insert into metaclass values (0);
Query OK, 1 row affected (0.05 sec)

mysql> select * from metaclass;
+---------------------+
| test_datetime |
+---------------------+
| 0000-00-00 00:00:00 |
| 0000-00-00 00:00:00 |
+---------------------+
2 rows in set (0.00 sec)
Edited 2014-12-06 23:09 (UTC)

[identity profile] rashid80.livejournal.com 2014-12-15 02:14 pm (UTC)(link)
Даже в долбанной 1с и то нет пустой даты.
Если в проперти объекта (типа дата) не указано значение, то в БД (MS SQL Server, Oracle, Postgres) запишется 0001.01.01 00:00:00 (yyyy.mm.dd hh:mm:ss)