MySQL + PHP: charset и collation

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

Проект пишется на PHP 5.2.x + MySQL 5.0 Так как проект международный, база сателлита находиться в collation utf8_unicode_ci.

У сателлита есть 2 части: так называемая клиентская и административная. Клиентская доступна всем и дёргается постоянно, административная только администраторам, ею пользуются раз в неделю примерно пока.

Клиентская часть, из-за ожидаемой нагрузки, писалась полностью мною, без использования каких-либо фреймворков, каркасов и прочего. Благо её простейшие функции позволяли это сделать быстро. Естественно, в качестве MySQL клиента был выбран mysqli, всё как надо, сразу после соединения был выставлен нужный charset, строго как в мануале:

$conn->set_charset("utf8")

Сам mysqli был выбран потому-что проект новый и у него вроде-как получше с поддержкой UTF-8 всё устроено.

Административная часть писалась коллегой, на пару со мной, причём ответственность за качество кода лежит на мне. Для большей скорости написания мы использовали Zend Framework, который мы оба довольно не плохо освоили к этому моменту. К тому-же, административная часть имела куда больше функций и меньше нагрузки, нежели клиентская. Единственное разногласие, которое у нас было с коллегой, это использовать или нет Zend_Form или нет из-за очень сложной кастомизации самих форм и их декораторов, неразумного использования комбинации <dd> и &ltdt> вокруг скрытых полей и прочих мелких религиозных и языковых разногласий. Ни одному из нас не возник простейший вопрос, как устроен другой компонент — Zend_Db. Определит ли он сам charset и collation, который мы используем и нам нужен или будет использовать тот, что установлен по умолчанию. И вот, сегодня мы поняли что мы выстрелили себе в ногу примерно две недели назад — не то пуля летело медленно и наконец долетела, не то порох сырой ныл и сработал только сейчас.

Я всегда думал, что умный Zend_Db как-то сам узнает какой нужно charset и collation использовать, раз он сам узнаёт какие поля у таблицы и какие значения туда можно писать, а какие нет. Оказалось что нет… Я был не прав и ему об этом нужно грубо говорить (ну или клиенту вдолбить в настройки по умолчанию).

Поэтому в самом начале ему пришлось прописать следующие строку сразу после инициализации:

$db->query('SET CHARACTER SET utf8');

Теоретически, если следовать документации Configuring the Character Set and Collation for Applications, хватило-бы только SET NAMES ‘utf8’, но в таком случае collation остался бы utf8_general_ci — а нам этого не хочется. Поэтому, копнув немного глубже, в Connection Character Sets and Collations, было найдено SET CHARACTER SET utf8.

После данных изменений со стороны административной части на Zend Framework, замены $conn->set_charset(“utf8”); тоже на $conn->query(‘SET CHARACTER SET utf8’); и правок в базе данных всё заработало прекраснейшим образом.

Я вот понять не могу, почему у Zend Framework нигде об этой проблеме не написано? Зачем у mysqli есть метод mysqli::set_charset, если он меняет collation на верный? Почему в PHP мануале написано не использовать «старый дедовский способ с SET NAMES»?

Вообще, если посмотреть на то, что я встречаю в других проектах, которые попадают к нам на поддержку или консультации, много кто зарывается на этих charset и collation к сожалению, особенно на мультиязычных проектах.

MySQL Community Server 5.0.33

MySQL выпускает source-only release версию 5.0.33 своего MySQL Community Server 7 января 2007. Так как это source-only release – никаких обновлений бинариков для операционных систем нету. И что вы думаете? Начинается огромный buzz что: Для платформы Windows бинарики будут теперь платными, а местами на форумах можно найти идеи, что теперь все будут платить за бинарики MySQL Community Server (а то отключат газ, электричество, воду и нефть).

Не верю я в это. Срубить ветку, которая тебя “кормила”? Я не думаю. Посмотрим в будущем.

Скачиваем и закачиваем большие базы в MySQL

Тем, кто имеет shell под Unix/Linux/MacOSX давно известна такая утилита как mysqldump для создания копии базы или всего MySQL сервера и mysql – клиент к MySQL серверу. На этих платформах сделать так называемый MySQL dump проще простого: mysqldump --user=root --password=myrootpassword --quote-names databsename > mydump.sql. А для того что бы закачать весь dump обратно в базу достаточо сделать mysql --user=root --password=myrootpassword databsename < mydump.sql. Если я где-то ошибся, простите и поправте, писал по памяти.

Но что делать тем, кому туже операцию нужно сделать под Windows платформой и других инструментов (phpMyAdmin, MySQL-Front, нечто подобное) под рукою нет? Я вот вечно теряю эти две строки, способные иногда спасти несколько минут рабочего времени (которые можно потратить на распитие чая с коллегами).

Итак, для того, что-бы сдлеать dump базы под Windows платформой:
C:\mysql\bin\mysqldump --host=localhost --user=root --password=myrootpassword --quote-names --result-file=mydump.sql databsename

Итак, для того, что-бы закачать весь dump обратно в базу под Windows платформой:
C:\mysql\bin\mysql --host=localhost --user=root --password=myrootpassword -e "source C:\path\to\dump\mydump.sql" databsename

Ссылки по теме: mysqldump и mysql.

Хм… я давно небыл на сайте MySQL-Front и ею не пользовался, а оказывается она переименована в SQLFront. Ко всему, весь данный проект продаётся (почти с молотка) и создатели ждут предложений по покупке всего проекта целиком, цену открыто не говорят – ждут предложений в электорннописьменном виде. Надо будет на неё посмотреть, что там нового и как она изменилась, так как оно было даже тогда довольно удобным инструментом. Покупать весь проект я не буду – кишка пока тонка ;-)

Прочитал вот новость от MySQL AB о Web 2.0

Прочёл статью MySQL Powering Web 2.0. Много думал… Мне вот интересно, кто это ещё кого “Powering”? MySQL Web 2.0 или Web 2.0 MySQL? Неужели только одна причина, по которой были выбраны продукты от MySQL AB? Только из-за easily “scale-out” on low-cost hardware?

Что-то мне кажется, что теперь весь “хай” вокруг продуктов от MySQL только из-за того, что оно удачно используется “великими” из Web 2.0. Что-то мне кажется, что всё это только потому, что вся модель Web 2.0 проектов иделаьно ложиться на моделях, предусмотреннх в продуктах MySQL и что всё там спроектироцвано сторого, что-бы работать на MySQL продуктах и надо отдать должное архитекторам и программистам Web 2.0 проектов за их правильные руки.

Хм, такую статью, я думаю, стоит написать всем из отряда Web 2.0, поменяв главное действуещее лицо и свойства.

Делал свой маленький набор Web-разработчика

С самого утра собираю маленький (334 MB) наборчик для себя, что-то вроде Денвера. Вот только под себя и для тех кто рядом… Входит в него: Apache 2, MySQL 3.23, MySQL 4.0, MySQL 4.1, MySQL 5.0, PHP 4.4.2 и phpMyAdmin. Всё устанавливается как сервисы по запуску одного .bat файла, удаляется так-же (сервисы с префиксами, и по-этому если что-то из этого списка стоит, его достаточно будет остановить). Надо только что-бы был свободен 80 порт для Apache и 3305-3308 для MySQL. Никаких файлов копировать в системные каталоги не надо. Причём тут-же ещё и дебугер установлен (для особо продвинутых). Если архивом, то весит 112 MB.

По хорошему там не хватает ещё SMTP/POP3 какого сервера, для отладки рассылок, отсылок, засылок всяких (я думаю это был-бы Mercury Mail Transport System)… И мануала, как что делать… Мне следовало такую вещь собрать уже давно, что-бы небыло таких проблем и глупых ситуаций

В принципе, ничего сложного – всё складываем рядом в один каталог, так что бы легко можно было кидать на флешку или болванку, DLL от PHP (и сам php4ts.dll и из каталога dll) кидаем к Apache в каталог bin, жёстко прописываем пути. Всё это легко ставиться из командной строки (как не странно для MS Windows 2000/XP) и без всяких srvany.exe. Просто данный софт (Apache, MySQL) отлично сам преспособлен к такой работе.