Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2015, 17:00   #1
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию MySQL - разная политика при добавлении записей для неуказанных в запросе NOT NULL полей

Добрый день.

Столкнулся с очень странным фактом поведения MySQL.

чувствую, что где-то меня обманывают, но как шулера за руку схватить - не пойму..

суть в следующем.
Есть ubunta, на ней поднят MySQL (версия 5.5.41-0ubuntu0.14.04.1 если это важно).

есть таблица.
Пусть это будет таблица, созданная таким скриптом (для примера):
Код:

CREATE TABLE IF NOT EXISTS `stest` (
  `id` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  `ip` varchar(50) NOT NULL COMMENT 'IP пользователя'
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

--
-- Индексы таблицы `stest`
--
ALTER TABLE `stest`
  ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `stest` (`name`);

ALTER TABLE `stest`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1;
и если там выполнить такой запрос:
Код:
INSERT INTO `stest` (`name`) VALUES ( "bar" )
то он ОТРАБАТЫВАЕТ.


Ставлю локально MySQL себе на компьютер (Windows 7), версия Версия сервера: 5.5.42 - MySQL Community Server (GPL).

создаю таблицу таким же скриптом.

выполняю этот же запрос. Он (справедливо) выдаёт ошибку:
Цитата:
Код:
Ошибка
SQL запрос:

INSERT INTO `stest` (`name`) VALUES ( "bar" )
Ответ MySQL: Документация

#1364 - Field 'ip' doesn't have a default value
казалось бы, всё в порядке!
Но! Почему этот запрос работает в первом случае?!!!
Как?!
Что это? какая-то хитрая настройка сервера?
Или дело в версии сервера? Или это глюк?

прошу знающих разъяснить мне, что я не знаю/не учитываю и чём тут подвох.

Спасибо.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.03.2015, 17:33   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Могу предположить, что в 1-ом случае есть неявное значение по умолчанию, во 2-ом нет.
Здесь есть упоминание для не явных умолчаний для NOT NULL полей http://phpclub.ru/mysql/doc/create-table.html
Почему в одной версии есть, в другой нет и как настраивается не скажу
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.03.2015, 17:55   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Аватар, спасибо за ответ!

Угу. Согласен. Скорее всего Вы правы. Но я пока не могу найти, где же эти самые "неявные умолчания" задаются!!

например, по вашей ссылочке текст буквально:
Цитата:
Величина DEFAULT должна быть константой, она не может быть функцией или выражением. Если для данного столбца не задается никакой величины DEFAULT, то MySQL автоматически назначает ее. Если столбец может принимать NULL как допустимую величину, то по умолчанию присваивается значение NULL. Если столбец объявлен как NOT NULL, то значение по умолчанию зависит от типа столбца...
Тогда получается, на убунту MySQL работает верно?
А у меня локально - не работает так, как должно?

У кого есть возможность, проверьте, пожалуйста на MySQL, как у Вас - позволяет сервер опускать имена not null (и без явного указания default) полей в запросе ?

p.s. похоже, что кроме меня, с таким странным поведением MySQL никто не сталкивался.. Или никого это не заинтересовало...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.03.2015, 18:22   #4
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

http://bugs.mysql.com/bug.php?id=14947
lomastr_ вне форума Ответить с цитированием
Старый 03.03.2015, 21:10   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

http://dev.mysql.com/doc/refman/5.0/...-defaults.html
MySQL NOT NULL DEFAULT
По моему как раз то, что нужно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 03.03.2015 в 21:13.
Аватар вне форума Ответить с цитированием
Старый 03.03.2015, 22:22   #6
crazy horse
ios developer
Старожил
 
Аватар для crazy horse
 
Регистрация: 16.11.2007
Сообщений: 2,885
По умолчанию

Потер, не очень правильно перечитал. lomastr_ вроде бы ссыль на баг кинул.
Делайте что хотите, но чтобы через полчаса в лесу было светло, сухо и медведь!
crazy horse вне форума Ответить с цитированием
Старый 03.03.2015, 23:38   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

lomastr_, точно так. Спасибо.

если кому-то интересно, статья на хабре: "Раскрываем магию MySQL или о строгости и мягкости MySQL"

Суть. Есть переменная sql_mode, через которую можно задавать поведение сервера.

В строгом режиме вставка для неуказанных полей не работает, в нестрогом - проставляются значения по умолчанию для заданного типа данных:

Цитата:
Дефолтные значения для типов данных

Если в insert запросе не указаны данные для одной из колонок, то MySQL будет обрабатывать эту ситуацию в следующем порядке:
1. Если столбец имеет значение по умолчанию, то используется это значение и на этом всё заканчивается, в противном случае происходит переход к следующему шагу
2. Если столбец не имеет параметр NOT NULL, то присваивается NULL и на этом всё заканчивается, в противном случае поведение зависит от переменной sql_mode, точнее от строгости самого режима.

Как можно было догадаться из предыдущей главы, строгий режим сразу вернёт ошибку, которая в свою очередь откатит транзакцию для транзакционных таблиц или отменит последнее действие для не транзакционных таблиц.

Для нестрого режима будет вставлено значение по умолчанию для заданного типа данных.
Значения по умолчанию для каждого типа данных:
Для типов int и float значение по умолчанию ноль (0)
Для всех строк, кроме типа enum – пустая строка ('')
Для enum – первый нумерованный член
Для даты и времени – нулевые значения '0000-00-00 00:00:00'
Для timestamp — текущая дата и время, если колонка была автоматически инициализирована, либо нулевыми значениями '0000-00-00 00:00:00'
на оригинальном сайте - 5.1.7 Server SQL Modes

теперь всё понятно.
всем спасибо.

Последний раз редактировалось Serge_Bliznykov; 03.03.2015 в 23:41.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с кодировкой при добавлении русскоязычных записей Delphi+MySql furstenberg БД в Delphi 6 07.06.2013 00:11
Не работает отмена при добавлении записей в таблицу Екатерина20 БД в Delphi 4 26.05.2012 17:23
Тормоза при добавлении записей в БД MS Access Vit@L БД в Delphi 12 17.05.2010 09:03
Ошибка при добавлении дополнительных полей на DLE 8.2 denis35 WordPress и другие CMS 13 15.11.2009 15:04
При удалении записей значения полей с type:=Autoincrement (т.е+) в оставшихся полей не изменяются kenta БД в Delphi 2 29.10.2009 08:28