MySQL : MySQL - Распространенные проблемы с русскими буквами и методы их решения

Распространенные проблемы с русскими буквами и методы их решения

У My SQL версии 4.1 и выше (далее 4.1+) с русскими буквами бывают несколько проблем — рассмотрим их по отдельности.


1. PHP ИСПОЛЬЗУЕТ НЕВЕРНУЮ КОДИРОВКУ В КАЧЕСТВЕ КЛИЕНТСКОЙ
Симптомы:
– Через phpMyAdmin (здесь и далее подразумевается версия умеющая работать с кодировками, т.е. >= 2.6.0) все по-русски, а в скрипт приходят вопросительные знаки.
– Скрипт, заносящий данные в базу, видит русский нормально, а после вставки, как в правильном скрипте, так и в phpMyAdmin-е — знаки вопросов.

Тестирование:
Попробуйте в начале вашего скрипта, но после соединения выполнить SQL-запрос «SET NAMES кодировка», где кодировка, та кодировка, в которой у вас (по вашему мнению) данные. Например, для русской виндовой кодировки (windows-1251) это будет cp1251, для KOI8-R – koi8r, для UTF-8 – utf8 и так далее. В дальнейшем она будет упоминаться как «кодировка«.

Результат тестирования:
Если буквы (но необязательно слова) стали русскими, значит данные в базе лежат в правильной кодировке, сама база эту самую кодировку и использует.
Если буквы стали русскими, а слова нет («бнопня»), значит скрипт ожидает данные в другой русской кодировке — пробуйте другие, пока не получится русских слов.

Решение:
1) Оставить запрос «SET NAMES кодировка» в начале скрипта, если скриптов много – см. вариант 2.
2) Заставить My SQL автоматом выполнять этот запрос при каждом коннекте к нему.
Для этого нужно в файле my.cnf/my.ini (где их искать — в документацию) в раздел [server] добавить следующую строку:
init-connect="SET NAMES кодировка"
Однако, следует заметить, что это НЕ будет работать, если пользователь, которым вы подключаетесь к базе имеет привилегию SUPER (а стандартный пользователь root к таким относится, так же как и все созданные через «GRANT ALL PRIVILEGES ON *.* TO ...»). Это сделано для того, чтобы в случае ошибки в этом запросе (а его можно изменить во время работы), хоть кто-то мог подключиться к базе и исправить его.
Внимание! Функция mysqli_client_encoding() и сотоварищи, отображает кодировку клиента на момент соединения и не меняют возвращаемое значение в процессе работы. Поэтому не стоит кричать, что кодировка не меняется. Просто делайте что говорят и смотрите результат работы скрипта. Получить нужное значение можно SQL-запросом “SHOW VARIABLES LIKE 'character_set_client'".
3) Начиная с версий 4.1.15 и 5.0.13 добавить в секцию [mysqld] или [server] файла my.cnf/my.ini параметр skip-character-set-client-handshake. Этот параметр заставляет сервер игнорировать кодироку, посылаемую клиентом, и использовать указанную серверу. В примере конфигурации ниже этот параметр уже есть.

2. My SQL ИСПОЛЬЗУЕТ НЕВЕРНУЮ КОДИРОВКУ
Симптомы:
Русский текст приходит в скрипт как русский, в консольном клиенте тоже все хорошо. Однако не работает сортировка, перевод в верхний/нижний регистр и т.д. Если применить решение из проблемы №1, то либо русский текст становится вопросами, либо mysql_error() возвращает сообщение похожее на «Illegal mix of collations (latin1_general_ci,IMPLICIT) and (cp1251_general_ci,COERCIBLE)...». В тоже время phpMyAdmin русский текст отображает как «крокозябры» (латинские символы с умляутами и т.д.).

Тестирование:
Попробуйте в phpMyAdmin-е выполнить запрос вида «SELECT CONVERT(CONVERT(поле USING binary) USING кодировка) FROM таблица», где таблица и поле соответствующая таблица и поле с русским текстом, а кодировка — кодировка из проблемы №1.

Результат тестирования:
Если буквы (но необязательно слова) стали русскими, значит текст в базе лежал не в правильной кодировке и его нужно сконвертировать.
Если буквы стали русскими, а слова нет («бнопня»), значит неверно выбрана одна из русских кодировок – пробуйте другие, пока не получится русских слов.

Решение:
1) Установить для My SQL нужную кодировку по умолчанию.
Внимание! Это решение сработает сработает, только если кодировки не переопределены для базы, таблицы или столбца.
Для этого нужно в файл my.cnf/my.ini в раздел [server] добавить следующую строку:
default-character-set=cp1251
2) Сконвертировать таблицы в нужную кодировку.
Про то как конвертировать таблицы с неверными кодировками хорошо написано в мануале. Повторять здесь то же самое не к чему.
Компилирование My SQL 4.1+ из исходников

Самостоятельная компиляция My SQL 4.1+ из исходников
1) Отконфигурировать (./configure) My SQL как минимум со следующими параметрами:
--with-charset=cp1251 – задает кодировку по умолчанию для сервера и клиента (для портов Free BSD – параметр для make WITH_CHARSET)
--with-collation=cp1251_general_ci – задает collation по умолчанию (для Free BSD – WITH_COLLATION)
--with-extra-charset=all – включает поддеркжу всех поддерживаемых My SQL кодировок (для Free BSD – WITH_XCHARSET)
Внимание! Для портов Free BSD нужно с такими параметрами собрать, как сервер, так и клиента. Тоже самое замечание относится и к случаю, когда клиент и сервер находятся физически на разных машинах. Т.е. нужно понимать, что и сервер, и клиент должны быть собраны с привильной кодировкой по умолчанию, иначе полного результата не будет.
2) Cкомпилировать и установить My SQL Smile.
3) Скомпилировать PHP с только что установленной библиотекой-клиентом My SQL (т.е. указав --with-mysql=/path/to/mysql).
Вы только посетили наш сайт, КОММЕНТИРОВАНИЕ будет доступно через несколько минут.
возможно у Вас отключен javascript, если включен - просто обновите страницу