Автор: Fix Xxer (PHP Club)
Сборка MySQL из исходников, является лучшим вариантом решения проблемы русских кодировок. Если же сборка затруднительна, необходимо настроить конфигурационный файл MySQL. Данный раздел подробно описывает шаги, которые необходимо предпринять в обоих случаях.
Сборка MySQL 4.1+ из исходников
1) Сконфигурировать (./configure) MySQL как минимум со следующими параметрами:
--with-charset=cp1251 – задает кодировку по умолчанию для сервера и клиента (для портов Free BSD – параметр для make WITH_CHARSET)
--with-collation=cp1251_general_ci – задает collation по умолчанию (для FreeBSD – WITH_COLLATION)
--with-extra-charset=all – включает поддеркжу всех поддерживаемых MySQL кодировок (для FreeBSD – WITH_XCHARSET)
Внимание! Для портов Free BSD нужно с такими параметрами собрать, как сервер, так и клиента. Тоже самое замечание относится и к случаю, когда клиент и сервер находятся физически на разных машинах. Т.е. нужно понимать, что и сервер, и клиент должны быть собраны с привильной кодировкой по умолчанию, иначе полного результата не будет.
2) Cкомпилировать и установить MySQL :).
3) Скомпилировать PHP с только что установленной библиотекой-клиентом MySQL (т.е. указав --with-mysql=/path/to/mysql).
Установка и настройка MySQL 4.1+ под Windows
Установка
Устанавливать MySQL, во избежание проблем в дальнейшем, желательно в каталог c:\mysql, однако это не обязательно. Других рекомендаций относительно установки нет. Устанавливайте как обычно.
Настройка
Проверьте наличие, и при необходимости добавьте в конфигурационный файл MySQL, следующие директивы (здесь и далее предполагается, что MySQL была установлена в c:\web files\mysql50):
[client]
port=3306
character-sets-dir=c:/web files/mysql50/share/charsets/
default-character-set=cp1251
[mysld]
bind-address=127.0.0.1
port=3306
basedir=c:/web files/mysql50/
datadir=c:/web files/mysql50/data
tmpdir=c:/tmp/
character-sets-dir=c:/web files/mysql50/share/charsets/
default-character-set=cp1251
# Этот параметр работает только для MySQL 4.1.15+ и 5.0.13+,
# если у вас более старая версия MySQL - рекомендую обновиться,
# т.к. этот параметр не требует никакого вмешательства со стороны php.
skip-character-set-client-handshake
После чего перезапустите My SQL и наслаждайтесь результатом :).
Некоторые замечания для Win 32 платформы
1) Помните, что стандартная Windows консоль имеет кодировку cp866 и как результат русские символы в cp1251 выводятся не корректно.
Есть два возможных решения этой проблемы:
- Выполнить запрос "SET NAMES cp866" после запуска mysql. Однако это сработает только при правильно настроенном сервере/базе/таблице – в противном случае будут вопросительные знаки. В общем не рекомендуется.
- Открыть новую виндовую консоль (например пойти в Start->Run (Пуск->Выполнить), набрать в поле ввода "cmd" (без кавычек) и нажать OK), в которой выполнить команду "chcp 1251" (опять же без кавычек) и сменить шрифт консоли (Щелчок правой кнопкой на заголовок окна->Properties (Свойства), закладка Font (Шрифт)) на "Lucuda Console" и поставить галочку "Bold fonts" (Жирные шрифты). Нажать "OK". В появившемся окне диалога выбрать "Save properties for future windows with same title" (Сохранить свойства для будущих окон с тем же заголовком) и нажать "OK". После этого можно в этой консоли запускать mysql и работать в нем. Чтобы не писать каждый раз "chcp 1251" можно в ключе строкового типа HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun или HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun написать "chcp 1251 > NUL" (и снова без кавычек). Тогда запуск mysql сведется к запуску cmd и уже в нем — mysql.
2) Помните, что php_mysql.dll всего лишь обертка для libmysql.dll, СЛЕДИТЕ за тем, какая libmysql.dll лежит у вас c:\windows\system32 и в других каталогах доступных через переменную окружения PATH.
3) Следите за тем, с каким my.ini/my.cnf запускается ваш клиент и сервер и какие там настройки default-character-set и character-sets-dir.
Лучше всего иметь один такой файлик — с:\my.cnf — и его копию в каталоге где установлен MySQL. Последнее удобно, когда установлено несколько MySQL, и для переключения между ними можно просто скопировать нужный из каталога его установки в с:\. С MySQL 5.0 все еще проще, он читает файл настроек из каталога, куда установлен. Т.е. с ним таковой в c:\ оказывается не нужен.
4) Учитывайте, что в PHP4 php_mysql.dll (до определенных версий, может в 4.3.11 уже поправили) собирается для 4.0.x и 3.23.x libmysql.dll, и пытается выхватить настройки из c:\my.cnf. Кроме того, постоянно проскакивает глюк, когда php как клиент при коннекте ищет charset'ы в папке c:\mysql\share\charsets причем в формате .conf, а не в новомодном .xml и номера чарсетов у MySQL 4.0- клиента отличаются от номеров которые посылает сервер MySQL 4.1+ при установлении коннекта.
Поэтому если при запуске mysql.exe от My SQL 4.0- вы видите ошибки вида:
File 'c:\mysql\share\charsets\?.conf' not found
(Errcode: 22) Character set '#51' is not a compiled character set and is not specified in the 'c:\mysql\share\charsets\Index' file
значит у вас одновременно на машине My SQL 4.0- и 4.1+ и для My SQL 4.1+ стоит default_character_set не включенный в c:\mysql\share\charsets\Index. Рецепт простой — идем в MySQL4.1+\share\charsets\Index.xml ищем там id="51", понимаем что это cp1251 родимый, добавляем в c:\mysql\share\charsets\Index строку
cp1251 51
и проверяем.
5) Всегда помните, php_mysql.dll собирается по умолчанию как клиент с кодировкой latin1, этот чарсет устанавливается при вызове mysql_connect и вы ничего с этим поделать не можете, кроме вызова "SET NAMES кодировка", из решения выше. Грубые хаки в виде правки Hex Edit?-ом dll-ки — не решение.
6) Важно понимать, что выполнение "SET NAMES кодировка" НИКАК не влияет на default_character_set который используется при СОЗДАНИИ таблиц по "CREATE TABLE" без указания charset и collation, они берутся из default-character-set my.ini/my.cnf. Чтобы это поправить нужно нормально настроить сервер (см. "установку" выше) или использовать комбинацию
SET NAMES кодировка;
SET character_set_database=кодировка;
SET character_set_server=кодировка;
7) Можно запускать mysqld-nt.exe с указанием альтернативного файла, из которого читать настройки, вместо стандартного, через параметр --defaults-file=путь/до/вашего/my.ini/my.cnf.
Однако, если в таком файле указаны опции для клиента, то параметр --default-file нужно указывать руками при вызове каждого отдельно взятого клиента.
Установить так сервис можно командой:
"mysqld-nt.exe --install mysql50 --defaults-file=с:\\web files\\mysql50\\my-config.cnf"
Дополнительно: