
Недавно один из проектов на работе мое руководство решило перенести на MSSQL (раньше работал на MySQL). Решение, не самое лучшее, учитывая все нюансы, но не в этом суть. Пришлось поковырять этого зверя и я сразу же наткнулся на ряд проблем с кодировками. В MySQL эти вопросы решаются на раз-два, но в MSSQL, как оказалось, не так все просто.
Проблема - сплошные крякозябры
Сайт в кодировке UTF-8, а это значит, что из БД надо данные тоже в утф. По техническим причинам, данные в MSSQL должны и хранятся в windows-1251. SET NAMES utf8 - не работает. Решения этого вопроса нашлось 2 (общался с нашим отделом DBA):
- На каждое строковое поле делать cast. Для хранимых процедур принимаемые параметры ставить тип nvarchar
- Кодировать из кодировки в кодировку на сайте при получении и отправке данных
Принял второй вариант, потому что не хотел захламлять код хранимых процедур всякими "кастами".
Решение
Написал свой адаптер для MSSQL, который наследует адаптер поставляемый Zend Framework. Суть его работы проста - все запросы и ответы кодируем в однобайтную кодировку (и обратно, конечно), на уровне адаптера, чтобы не делать это по всему проекту.
Эм.. И что? Просто это еще не весь код :) На самом деле адаптер сделан для удобства использования, но весь код находится еще ниже - в Statement классе:
Использовать все это тоже не сложно (не забываем добавить свой нэймспэйс):
Надеюсь приведенное решение избавит кого-то от потери часа времени :)
TODO:
- Сделать возможность настраивать через конфиг, из чего кодировать и во что
Обратите внимание на каталог компаний по странам СНГ, можно также почитать о том, как соблазнить девушку.
