Здравствуйте! Последнее время на сайте часто проскакивает вопрос на тему «Кодировка в MySQL» или нечто подобное.
Начну с того, что скажу: все данные должны быть в одной кодировке. И файл со скриптом, и данные в таблице БД и отправляемые заголовки браузеру с указанием кодировки( если есть ). На примере это должно быть видно.
Файл содержащий этот код сохранен с кодировкой CP1251 и данные в таблице БД хранятся в UTF8
Кодировка, в которой нужно вывести посетителю данные. Она может отличаться от кодировки файла. Главное помнить: если кодировка вывода отличается от кодировки файла, то и выводимые данные также должны быть перекодированы в эту кодировку( кодировку отправляемого заголовка, проще говоря ). Я не сторонник подобного. Лучше сразу указывать одну кодировку, что бы не тратить время еще и на перекодировку в самом скрипте.
mysql_set_charset( ‘utf8’ );
В этой строке мы указываем серверу MySQL, что данные нужно перекодировать в utf8. В нашем случае это не обязательно( у нас и так БД с такой кодировкой ). Но это пример и хочется охватить как можно больший диапазон задаваемых вопросов пользователями. Эта функция, кстати, заменяет все эти запросы:
mysql_query ("set_client='utf8'"); mysql_query ("set character_set_results='utf8'"); mysql_query ("set collation_connection='utf8_general_ci'"); mysql_query ("SET NAMES utf8");
И работает значительно быстрее. Но появилась она только в PHP 5.2.3 и поддерживается MySQL сервером с версией >= 5.0.7. Если используете эту функцию, то подобные запросы можно не отправлять. В эту функцию передается та кодировка, которая указывается в отправляемом заголовке( если есть ) или кодировка самого файла( если такого заголовка нет ). Если кодировка файла и таблицы в БД совпадает, то использовать эту функцию( как и заголовки выше ) нет смысла. Так же хочу обратить внимание читателя на то, что при работе с БД кодировка пишется без дефиса( utf8 ). Будьте внимательны, если не верно указать кодировку, то вывод будет состоять из вопросиков ( ??? ).
iconv( ‘cp1251’, ‘utf-8’, ‘Текст!’ );
Обратите внимание, что если отправляемый заголовок отличается от кодировки файла, то все выводимые данные нужно так же перекодировать в кодировку, указываемую в отправляемом заголовке. Для данных из таблицы в БД это делается, при вызове функции mysql_set_charset();,а для другого текста это можно сделать функцией iconv();. В первом параметре этой функции передается текущая кодировка ( кодировка файла ), во втором параметре — желаемая кодировка( кодировка заголовка ) ну а в третьем — сам текст, который необходимо перекодировать.
Вроде бы все написал. Всё, что хотел вернее
Если у вас выводится текст из базы вот так
Краткая
Значит у вас соединение с БД работает в кодировке UTF-8, а страница открыта в браузере в кодировке cp1251.
Решение:
-либо сохраните страницы в кодировке UTF-8 без BOM и укажите в .htacces для сервера apache кодировку
AddDefaultCharset utf-8
вместо .htaccess можно отправить заголовок с помощью
header(‘Content-Type: text/html; charset=utf-8’);
Это позволить сайту работать в UTF-8 кодировке.
либо выполните запрос в бд сразу после соединения
SET NAMES 'cp1251';
Это позволит работать сайту в кодировке windows-1251.
Если из базы выводится текст так
�������
то всё с точностью до наоборот

Предпочтительней работать в кодировке UTF-8.
Например вы захотите использовать AJAX, но в некоторых браухерах он работает только с кодировкой UTF-8.
Или функцию json_encode — она тоже работает с кодировкой UTF-8.
Так же в XML лучше использовать эту кодировку.
Если же у вас такой вывод:
???????????
Это скорей всего означает что данных в таблице в кириллице нет вообще.
Часто это из за того, что по умолчанию в MySQL используется кодировка latin1.
И если создать таблицу без явного указания другой кодировки, то она будет создана в latin1. А данная кодировка вообще не работает с кириллицей.
Посмотрите что выводит запрос
SHOW CREATE TABLE `table`;
где table — имя таблицы
Пример вывода
Это говорит о том тчо таблица в кодировке latin1 по умолчанию. Можно исправить таким запросом
ALTERTABLE `table` CONVERTTOCHARACTERSET ‘utf8’;