Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

MySQL - strict mode (Антон Макаренко)
Author Message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Tue Dec 12, 2006 6:11 pm ()
   Post subject:
Reply with quote


М

Выделено из темы «DbSimple v2.x: лаконичная работа с различными СУБД»,
расположенной в форуме Конструктор (13 Декабря 2006, 15:40).
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Tue Dec 12, 2006 6:11 pm (спустя 1 секунду; написано за 7 минут 29 секунд)
   Post subject:
Reply with quote

[feature request]

При использовании MySQL 5.0.27 в режиме strict mode обнаружилась невозможность в запросе задавать колонкам значения неподходящего типа. Иными словами, в строгом режиме MySQL не приводит типы, а выбрасывает ошибку. Например:
Code (SQL): скопировать код в буфер обмена
INSERT INTO phpbb_users (user_id, user_active, username, user_password, user_session_time, user_session_page, user_lastvisit, user_regdate, user_level, user_posts, user_timezone, user_style, user_lang, user_dateformat, user_new_privmsg, user_unread_privmsg, user_last_privmsg, user_emailtime, user_viewemail, user_attachsig, user_allowhtml, user_allowbbcode, user_allowsmile, user_allowavatar, user_allow_pm, user_allow_viewonline, user_notify, user_notify_pm, user_popup_pm, user_rank, user_avatar, user_avatar_type, user_email, user_icq, user_website, user_from, user_sig, user_sig_bbcode_uid, user_aim, user_yim, user_msnm, user_occ, user_interests, user_actkey, user_newpasswd)
VALUES ('6', '1', 'sdfsdf dsfgsdg', '343b1c4a3ea721b2d640fc8700db0f36', '0', '0', '0', '1165595062', '0', '0', '0', '', '', 'd.m.Y H:i', '0', '0', '0', '', '', '', '0', '1', '1', '1', '1', '1', '0', '0', '0', '0', '', '1', 'fdsafd@mail.ru', '', '', 'Albania', '', '', '', '', '', '', '', '', '')
  -- error #1366: Incorrect integer value: '' for column 'user_style' at row 1 at ...
 
Это код, сгенерированный DbSimple query() с плейсхолдером ?a.

Что если при составлении запроса при передаче массивов в ?a и ?# анализировать числа и булевы и не окружать их кавычками?

Конечно, можно отключить strict mode разными способами, но это плохой выход.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Wed Dec 13, 2006 12:27 am (спустя 6 часов 15 минут)
   Post subject:
Reply with quote

Антон Макаренко wrote:
Incorrect integer value: ''
Погодите-ка, а почему там пустая строка? Ведь это и правда incorrect value. Попробуйте передать строку '1', к примеру - наверняка ведь сработает так же, как передача 1, и не будет нотиса.

Почему ?a всегда вставляет строки: дело в том, что в FireBird конвертировать строку в число - можно, а вот число в строку - далеко не всегда (как это ни странно). Я с этим сталкивался. Поэтому строка - более общий тип, чем число (к тому же в виде строк представляются еще и даты).
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Wed Dec 13, 2006 1:21 am (спустя 54 минуты; написано за 2 минуты 3 секунды)
   Post subject:
Reply with quote

Антон Макаренко
Дмитрий Котеров wrote:
Погодите-ка, а почему там пустая строка? Ведь это и правда incorrect value. Попробуйте передать строку '1', к примеру - наверняка ведь сработает так же, как передача 1, и не будет нотиса.
Только что проверил:
Quote:
g-band ~ # mysql --version
mysql Ver 14.12 Distrib 5.0.30, for pc-linux-gnu (i686) using readline 5.1

g-band ~ # mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.30-log Gentoo Linux mysql-5.0.30

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| mysql |
+--------------------+
3 rows in set (0.00 sec)

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> use test;
Database changed
mysql> set SQL_MODE='STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.00 sec)

mysql> select @@session.sql_mode;
+--------------------+
| @@session.sql_mode |
+--------------------+
| STRICT_ALL_TABLES |
+--------------------+
1 row in set (0.00 sec)

mysql> create table my(id int);
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| my |
+----------------+
1 row in set (0.00 sec)

mysql> insert into my(id) values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into my(id) values('10');
Query OK, 1 row affected (0.00 sec)

mysql> select * from my;
+------+
| id |
+------+
| 1 |
| 10 |
+------+
2 rows in set (0.00 sec)

mysql> exit;
Bye
Так что, разбирайтесь в своем коде (-;
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Wed Dec 13, 2006 2:38 am (спустя 1 час 16 минут; написано за 5 минут 35 секунд)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
$phpbb_users=array (www.php.net/array)(
        'user_id'            =>1
        ,'user_active'       =>1
        ,'username'          =>'test'
        ,'user_password'     =>md5('test')
        ,'user_session_time' =>0
        ,'user_session_page' =>0
        ,'user_lastvisit'    =>0
        ,'user_regdate'      =>time()
        ,'user_level'        =>0
        ,'user_posts'        =>0
        ,'user_timezone'     =>0
        ,'user_style'        =>false        // собака порылась тут
        // etc...
);
$DB->query('
        INSERT INTO phpbb_users ('
.implode(', ', array_keys (www.php.net/array_keys)($phpbb_users)).')
        VALUES (?a)'
, array_values (www.php.net/array_values)($phpbb_users)
);
Тесты показали, что:
 false преобразовывается в '',
 true в '1'
 null в NULL

С толку сразу сбило выражение "Incorrect integer value" - там поле типа tinyint(4).

Спасибо за помощь.
Наверное, ветку можно перенести в отдельный топик.

p.s. Завтра еще в Фаербёрде проверю.
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Wed Dec 13, 2006 3:42 pm (спустя 13 часов 4 минуты; написано за 17 секунд)
   Post subject:
Reply with quote

Антон Макаренко wrote:
Завтра еще в Фаербёрде проверю.
Там нормально все - моя основная рабочая СУБД.
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Wed Dec 13, 2006 9:52 pm (спустя 6 часов 9 минут; написано за 12 секунд)
   Post subject:
Reply with quote

ok, спасибо
Back to top
View user's profile Send private message Send e-mail
Dark-Demon
Участник форума
Banned


Joined: 04 Feb 2007
Posts: 45
Карма: -3
   поощрить/наказать

Location: spb

PostPosted: Sun Feb 04, 2007 5:17 am (спустя 1 месяц 21 день 7 часов 25 минут; написано за 3 минуты 16 секунд)
   Post subject:
Reply with quote

Quote:
При использовании MySQL 5.0.27 в режиме strict mode обнаружилась невозможность в запросе задавать колонкам значения неподходящего типа. Иными словами, в строгом режиме MySQL не приводит типы, а выбрасывает ошибку.
вот за что люблю SQLite, так это за то, что там этого нет в принципе :)

ладно, если значения в кавычках все субд понимают нормально, то как дело обстоит с именами таблиц, полей, бд?
к чему я клоню: почему бы не писать их без закавычивания (как, например, требует SQLite)? если в MySQL не закавычить (заобратноаппострафить ;)) имена полей в insert, то будет большой каюк. я пока вышел из этого положения указанием имени таблицы перед именем поля.
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Wed Feb 07, 2007 2:00 pm (спустя 3 дня 8 часов 42 минуты; написано за 1 минуту 54 секунды)
   Post subject:
Reply with quote

Если не ошибаюсь, "спец-кавычки" для идентификаторов есть в любой СУБД:
- MySQL: `ident`
- PgSQL, FireBird: "ident"
- MSSQL: [ident]
- SQLite: "ident" (не уверен насчет этого, но вроде бы "" - это стандарт SQL'92)

Кстати, в качестве "ident" - не обязательно имя поля, это может быть и имя функции, и вообще все, что воспринимается как идентификатор
Back to top
View user's profile Send private message Send e-mail
dark_demon
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Feb 07, 2007 3:25 pm (спустя 1 час 24 минуты; написано за 29 секунд)
   Post subject:
Reply with quote

ясно, спасибо. я тут ещё поэкспериментировал и пришёл к выводу, что полностью от них не отказаться...
Back to top
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML