MySql и русская кодировка

Проблема возникает, если вы работаете с кодировкой, отличной от UTF-8, и храните в базе данных тексты, к примеру, в кодировке cp1251. Но MySql не всегда использует по умолчанию кодировку cp1251, в частности, не всегда по умолчанию используется эта кодировка для соединений с базой. Из-за этого возникают ситуации, когда в базе тексты хранятся в нормальном читабельном виде, но при выводе этих данных на сайт появляются одни лишь «кракозяблы» (знаки вопросов вместо букв – «?????????? ????»).

Для борьбы с этим явлением нужно использовать следующий ряд запросов, которые должны выполняться после каждого коннекта к базе:

mysql_query("SET NAMES 'cp1251'");
mysql_query("SET CHARACTER SET 'cp1251'");

Обновлено: Количество запросов уменьшено благодаря прояснению ситуации Бирц`ом (см. комментарии).

Это обычно помогает. Единственное неудобство, что каждый раз будут выполняться эти избыточные, по сути, запросы (как не крути, а это дополнительные нагрузки на сервер, хотя предполагаю, что достаточно мизерные). Еще бывают ситуации, когда нет возможности прописать эти строки после каждого коннекта, если вы, к примеру, используете какую-то программу, работающую напрямую с базой данных и не имеющую соответствующих настроек в себе.

На серверах, которые предоставляют услуги хостинга для русскоязычных сайтов, чаще всего все в порядке и такой проблемы нет (т.к. у них по умолчанию MySql настроен на работу в первую очередь с кодировкой cp1251). Если ваш сайт использует иностранный хостинг, то, скорее всего, единственным способом решения проблемы будет способ, описанный выше.

Но если же вы имеете возможность подкорректировать конфиг MySql на сервере, тогда есть еще одно решение, реализацию которого я с радостью для себя обнаружил (я-то «догадывался», что можно как-то изменить настройки самого MySql, но как это сделать, не знал) 🙂

MySQL и русская кодировка WINDOWS-1251

Сегодня мы рассмотрим, что нужно написать в конфигурационном файле /etc/my.cnf для того, чтобы настроить mysql стандартной сборки на работу с кодировкой cp1251 по умолчанию без всякой перекомпиляции.

Рассмотрим пример конфига на основе MySQL 5.x.

В раздел [mysqld] необходимо добавить следующее:

default-character-set=cp1251
character-set-server=cp1251
collation-server=cp1251_general_ci
init-connect=»SET NAMES cp1251″
skip-character-set-client-handshake

Две последние строки принудительно устанавливают кодировку cp1251 для всех запросов.

В раздел [mysqldump] достаточно добавить только

default-character-set=cp1251

Этого достаточно, чтобы MySQL работал с windows-1251 кодировкой по умолчанию.

(с) dodik.ru

Теперь я могу использовать свой локальный сервер на XAMPP (ну не нравится мне Денвер…) более комфортно 🙂 Также это прекрасно сработало на «самодельном» сервере под SUSE.

Автор

  • То-то я озадачился (перед тем как писал топик), почему у меня в некоторых проектах было прописано только mysql_query(”SET NAMES ‘cp1251?”); и все работало, при этом во многих местах советуют писать кучу запросов.
    Спасибо, теперь ситуация прояснилась 🙂

  • Бирц

    По идее этот запрос:
    mysql_query(«SET NAMES ‘cp1251′»);
    Равносилен этим трём:
    SET character_set_client = cp1251;
    SET character_set_results = cp1251;
    SET character_set_connection = cp1251;

    А этот:
    SET CHARACTER SET x
    Равносилен:
    SET character_set_client = x;
    SET character_set_results = x;
    SET collation_connection = @@collation_database;
    Причем character_set_connection не обязательно задавать явно.
    Т.е. можно обойтись 2 запросами, а на практике как правило вообще одним SET NAMES.
    Лично я не сталкивался со случаем, когда кроме SET NAMES требовалось и SET CHARACTER SET.
    http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

  • Artur

    V moem sluchae srabotalo tolko eta kombinaciya:

    mysql_query(«SET NAMES ‘utf8′»);
    mysql_query(«SET CHARACTER SET ‘utf8′»);

    Odnoy strokoy ne udalos.

  • Chri

    mysql_query(”SET NAMES ‘utf8?”);
    mysql_query(”SET CHARACTER SET ‘utf8?”);

    Во очень пригодилось скоро открываю форум 😀

  • лена

    Спасибки огромное за статью. После переноса сайта русский текст отображался ?????. MySQL 5 кодировка utf8. Внесла изменения:
    В раздел [mysqld] необходимо добавить следующее:

    default-character-set=cp1251
    character-set-server=cp1251
    collation-server=cp1251_general_ci
    init-connect=”SET NAMES cp1251?
    skip-character-set-client-handshake

    Две последние строки принудительно устанавливают кодировку cp1251 для всех запросов.

    В раздел [mysqldump] достаточно добавить только

    default-character-set=cp1251

    в файл my.ini, заработало.

  • Alex

    есть cms-ка. при внесении записей в бд через нее, они записываются в бд в виде ?????. и затем, естественно также и отображаются. как пофиксить?

  • blond-programmer

    СПАСИБА!!!я уже была готова головой об стену биться, а оказывается всё так просто! 😆 😆 😆

  • Привет!
    помогли твои советы. И еще по теме —
    http://novikov.ua/articles/web-adaptation/6766/
    http://www.opennet.ru/base/dev/mysql_cp1251.txt.html

  • Yadfewm

    а что тут нужно сделать? http://artel.yadfewm.com/ (поставил ксамп дома, отредактировал my.ini как сказано тут, нарисовал дома сайт скинул его на хостинг — и появидись вопросы… только в бд)
    ни
    1. mysql_query(«SET NAMES ‘cp1251′»);
    2. mysql_query(«SET CHARACTER SET ‘cp1251′»);
    ни тоже самое с UTF не помогает, на хостинге доступа к my.ini нет.

  • Yadfewm

    Все, я все сделал… И кажется всё понял… 💡 Надеюсь правильно… 😀

    Лучше бы написали статью как оно все работает ❗ , на пальцах, чем давать ответы на вопрос «Как сделать чтоб заработало»

    Вроде в БД все хранится в той кодировке в какой это все туда запихивалось, и соответственно и соединение с бд и кодировка самой страницы сайта должна быть такой же. Хотя есть исключения 😯 😯 😯 ❗ ❓

  • Макс

    А вот у меня ничего не получается 🙁
    Я воспользовался советом, делал запросы на cp1251, utf8, latin1, cp866-не выходит. Ставил useUnicode=true&characterEncoding=utf8 (страницы в ютф и в анси пробовал)-ничего. В консоли написал set names utf8 и попробовал записать по-русски-ничего, только binary и latin1.
    Не знаю, что делать. У меня 5-й мускул…

  • Макс

    говорят, что все надо писать на ютф. А как?

  • Артур

    Может кто-нибудь подскажет как во флешроликах поменять кодировку на русскую. Например на boxedart в шаблоне сайта
    хидер на флеше. Так вот там слова подгружаются через экшнскрипт как переменные которые можно изменять. И вот вопрос: как задать значения переменных на русском. Когда пытался это сделать выходили пустые поля. Если кто знает решение то подскажите плиз.

  • Z0RG

    А я бы пи*й давал всем кто еще использует CP-1251. Вот серьезно, отсюда все проблемы. Давно пора уже признать UTF8 международным стандартом и использовать его. А с перекодировкой туда сюда ваших проектов на CP1251 которые ко мне потом попадают, вот чес слово, убил бы.

  • Z0RG

    «На серверах, которые предоставляют услуги хостинга для русскоязычных сайтов»
    — и администрации таких серверов я бы тоже раздал.

    «можно как-то изменить настройки самого MySql, но как это сделать, не знал)»
    — Ezo, ты обращайся, если что. Я в первую очередь все-таки UNIX админ, а потом уже программер 🙂

  • Помогли советы для mysql кодировки cp1251
    Но вот у самого сервера нужно ли менять кодировку с utf8 на cp1251?
    Почему то при locale отображает везде POSIX

  • cawok

    ЭЭЭ! Спасибо! Головой уже бился, а все так просто. С ЮТВ-8 работает тоже

  • Спасибо огромное!!!!
    У хостинга по умолчанию latin1_swedish_ci — пол дня билась, а оно все вопросы выводит!!
    Запросы:
    mysql_query(«SET NAMES ‘cp1251′»);
    mysql_query(«SET CHARACTER SET ‘cp1251′»);
    решили проблему.

  • Татьяна

    Огромное спасибо!!!!!

  • 1.
    mysql_query(«SET NAMES ‘cp1251′»);
    2.
    mysql_query(«SET CHARACTER SET ‘cp1251′»);

    помогло! спасибо большое..

  • Был мускул 5 с кодировкой по дефолту в my.cnf — utf8
    И таблицы в cp1251
    Есстественно знаки вопроса
    поставил по вашему методу в перль скрипте

    $dbh->do(«SET NAMES ‘cp1251′»);
    $dbh->do(«SET CHARACTER SET ‘cp1251′»);

    Все заработало, спасибо)

  • Admin

    спасибо, в кратковременной перспективе очень выручило. С самим сервером можно досконально разобраться позднее когда знаний прибавится, очень полезная «таблетка»

  • Вообщем что только я неперепробывал, не получалось ничего!
    Вообщем методом тыка добился своего успеха и предлагаю Вам его:

    1) my.ini файл оставил в покое — не вносил никаких изменений
    2) настроил кодировку с phpadmin -> SQL
    кодировка (сравнение) в строках таблицы : cpl1251_general_cs
    3) в самом php файле (который работает с вашей базой) при соединении указал следующее:
    $db = mysql_connect(«localhost»,»userman»,»parol»);
    mysql_query(«set names ‘cp1251′»);
    $result=mysql_select_db(«basesql»,$db);

    Готово! Мне помогло! Можете пробывать!

  • Stepanov G

    Спасибо!

  • Sanja

    большое спасибо!!! 2 дня просидел ничего не помогало, самое главное что вводил те же запросы только на утф-8 ))

  • Xakep

    Помогла после чистой установки денвера только эта строка: «mysql_query(«SET CHARACTER SET ‘utf8′»);» прописанная в файле config.php скрипта, который работает сбазой!… Спасибо за экономию дней моих! 2 дня искал проблему!… 🙂

  • Роман

    БЛЯ СПАСИБО ЧУВАК!!! ЕБАЛСЯ НЕДЕЛЮ, А ТЫ ВСЕ РЕШИЛ!!! СПАСИБО БРАТАН!! ЯХУУ
    ЯХУ ЯХУ!!!!!!

  • Denoks

    Сразу помогло. Спасибо большое!!!!!!!!!!!!!!!!!!!

  • Екатерина

    Спасибо ОГРОМНОЕ!

  • Владимир

    Ребята, подскажите пожалуйста.
    Хоть прибейте… не могу понять куда вставлять эти две строки в joomla
    Понимаю, что в файл database.php, понимаю, что где-то в районе function database, но куда именно?;)

    заранее благодарю

  • Юрий

    Мне не помогли эти советы, нарыл в интернете другое решение
    mysqli_set_charset($connect, «utf8»);