Предыстория такова: писал я скрипт, который коннектится к pop3-серверу, выдирает оттуда все аттачи с нужными названиями файлов, парсит эти файлы и заносит отпарсенные данные в бд. Все было отлично, пока я писал на линуксе (писал, естественно, на php + mysql), а вот при попытке запустить этот скрипт на свежеустановленной винде (естественно, с апачем и прочим барахлом) - пошли error’ы…
Сразу скажу - пост написан совсем не для того, чтобы учить меня юзать ORM и ActiveRecord. Всё мы знаем, всё умеем, ноэто не тот случай.
Начнем издалека, а именно с PHP. В нем есть такой хороший и нужный (кроме программеров на си) тип как boolean, у которого есть значения true и false. Все бы хорошо, но есть одна проблема - при работе с бд все значения нужно преобразовывать к типу string (ну, а как вы sql писать собираетесь)… Точнее, это не проблема, а такой факт… Проблемы начинают возникать, когда мы преобразовываем boolean -> string. Преобразование получается довольно хитрое, в результате которого мы вместо true получаем ‘1′, а вместо false - … нет, если бы мы ‘0′ получали - все было бы отлично… мы получаем ”, т.е. пустую строку.
Этой проблеме уже хер знает сколько лет. Лечить ее разработчикам, видимо, влом.
Естественно, при вставке в БД все значения квотятся. Т.е. если у нас был запрос, в котором значение для поля будет false - получим примерно следующее:
INSERT INTO table(column) VALUES('')
Если бы типом column была строка - было бы всё ок. Но у меня это было булевое поле (если быть точным - smallint(1), т.к. в MySQL нет типа Boolean). И вот в линуксе (ubuntu) на MySQL Server’е из стандартных репозиториев все работало замечательно. А в винде - начало ругаться на эту строку.
Естественно, в данном случае можно решить проблему храня в переменных PHP не true/false, а 1/0, но меня заинтересовало - а почему же на Linux’е все это дело работает.
Покопавшись в настройках сначала PHP, а потом и MySQL (после того, как в PHP’шных настроках ничего интересного не нашел) - в my.ini (конфигурационный файл MySQL) были найдены интересные строчки:
# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
После того, как я их закомментировал, все заработало нормально, но…
Подытожу - при работе с MySQL в PHP не используйте переменные типа boolean, пользуйтесь int’ами. Даже если у вас все работает с true/false - не факт, что оно заработает у вашего заказчика.
written by FX Poster
\\ tags: MySQL, PHP
Последние комментарии