За последние 24 часа нас посетили 17198 программистов и 1302 робота. Сейчас ищут 1665 программистов ...

Автопреобразование пустой строки в число

Тема в разделе "PHP и базы данных", создана пользователем Mavir, 15 сен 2006.

  1. Mavir

    Mavir Guest

    Есть проблема при вставке пустой строки в числовое поле.

    Например, запрос в OsCommerce
    Код (Text):
    1. insert into whos_online (customer_id, full_name, session_id, ip_address, time_entry, time_last_click, last_page_url) values ('', 'Guest', '952701fe8136447b96d869658a4c2daf', '127.0.0.1', '1158263139', '1158263139', '/')
    выдает ошибку "Out of range value adjusted for column 'customer_id' at row 1"
    Если для поля customer_id подставить число или строку в виде числа (например, '7'), то запрос выполняется.
    Такие же проблемы есть и на форуме IPB.

    Можно ли с помощью настроек MySQL как-нибудь побороть эту беду?
    MySQL 5.0.22. На четвертом MySQL эти запросы проходили.
     
  2. Anonymous

    Anonymous Guest

    вместо пробела попробуй слать NULL...
    А вообще, зависит от структуры таблицы...
     
  3. Mavir

    Mavir Guest

    Это помогает. Но проекты не мои (osCommerce) и надо только поменять дизайн. А полдня вылавливать все неправильные запросы как-то не катит.

    Да, забыл структуру указать
    CREATE TABLE `whos_online` (
    `customer_id` int(11) default NULL,
    `full_name` varchar(64) NOT NULL default '',
    `session_id` varchar(128) NOT NULL default '',
    `ip_address` varchar(15) NOT NULL default '',
    `time_entry` varchar(14) NOT NULL default '',
    `time_last_click` varchar(14) NOT NULL default '',
    `last_page_url` varchar(64) NOT NULL default ''
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
     
  4. Anonymous

    Anonymous Guest

    Тогда да, NULL... или вообще убрать из запросов поле customer_id и тогда NULL там будет ставится автоматически в любой версии MySQL...
     
  5. Mavir

    Mavir Guest

    На уровне запросов я и сам знаю решение. Мне надо на уровне MySQL, чтобы не менять запросы.
     
  6. Anonymous

    Anonymous Guest

    Никак. То что пустая строка для целочисенного поля воспринималась старыми мускулями как NULL - недоработка... точнее, допущение.
    Хотя можешь создать триггер на insert и если customer_id = '' вставлять NULL...
    Но это тоже заплатка, как бы...
     
  7. Mavir

    Mavir Guest

    Опять двадцать пять. Править код не подходит. Спасибо за помощь, главное узнал что нельзя.

    P.S. У меня установлено два MySQL - 4-й и 5-й. Поэтому когда надо работать с osCommerce (а это бывает очень редко), я останавливаю пятый и запускаю четвертый. Просто хотел узнать можно ли как-нибудь уговорить пятый воспринимать пустые строки.
     
  8. Anonymous

    Anonymous Guest

    Я же сказал, можно -
    Создать в 5 мускуле триггер, срабатывающий на вставку в таблицу и смотреть, если всталяется пустая строка, то вставлять вместо нее NULL...
     
  9. Mavir

    Mavir Guest

    Пробежался по описанию триггеров. Все равно надо править код. А если попадется другой продукт с такой же бедой (например, форум IPB), опять нужно править.

    Если есть решение на уровне настроек MySQL, то подскажи. Что-то менять в коде не подходит.
     
  10. Anonymous

    Anonymous Guest

    Хм. Почитаю счас мануал по мускулю - я с триггерами плотно работал только в Oracle - может там что по другому...[/quote]
     
  11. Anonymous

    Anonymous Guest

    вроде, все правильно... тебе нуна сделать что то вроде
    PHP:
    1.  
    2. CREATE TRIGGER space_check BEFORE INSERT ON whos_online
    3.     FOR EACH ROW
    4.     BEGIN
    5.         IF NEW.customer_id = '' THEN
    6.             SET NEW.customer_id = NULL;
    7.          END IF;
    8.     END;
    9.  
     
  12. Mavir

    Mavir Guest

    Куда вставить?
     
  13. Anonymous

    Anonymous Guest

    Никуда. Один раз выполнить в мускуле.
     
  14. Mavir

    Mavir Guest

    Возращаясь к преобразованию.

    Триггеры вещь хорошая, Горбунов Олег спасибо большое за совет, но с пустыми строками почему-то не проходит.
    Если, например, в варианте
    Код (Text):
    1. CREATE TRIGGER space_check BEFORE INSERT ON whos_online
    2.     FOR EACH ROW
    3.     BEGIN
    4.         IF NEW.customer_id = '' THEN
    5.             SET NEW.customer_id = NULL;
    6.          END IF;
    7.     END;
    изменить условие на
    Код (Text):
    1.  
    2.         IF NEW.customer_id = '6' THEN
    3.             SET NEW.customer_id = 7;
    4.          END IF;
    то при вставке в поле customer_id значения 6, оно заменяется на 7.

    Но все таки есть решение на уровне настроек. Надо в конфигурационном файле для переменной sql-mode убрать STRICT_TRANS_TABLES.