Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/583: Рейтинг темы: голосов - 583, средняя оценка - 4.69
romchiksoad
1951 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,067
Записей в блоге: 2
1

Базы Данных. Кодировка ввода/вывода.

27.11.2010, 14:49. Просмотров 106738. Ответов 2

Здравствуйте! Последнее время на форуме часто проскакивает вопрос на тему "Кодировка в MySQL" или нечто подобное. Создано множество подобных тем, в которых форумчане неустанно пишут одно и тоже. Что бы как-то сократить дублирование одинаковых, по сути, вопросов, а так же время на поиск нужного ответа и не ждать того завораживающего момента, когда кто-то ответит в Вашей теме, и была создана данная тема. Она не большая, т.к. собрано все самое основное. И так, приступим.
Начну с того, что скажу: все данные должны быть в одной кодировке. И файл со скриптом, и данные в таблице БД и отправляемые заголовки браузеру с указанием кодировки( если есть ). На примере это должно быть видно.
Файл содержащий этот код сохранен с кодировкой CP1251 и данные в таблице БД хранятся в UTF8
PHP
1
2
3
4
5
6
7
8
9
10
<?php
header( 'Content-Type: text/html; charset=utf-8' );
mysql_connect( 'MyHOST', 'MyLOGIN', 'MyPASS' );
mysql_select_db( 'MyDB' );
mysql_set_charset( 'utf8' );
$query = mysql_query( "SELECT * FROM `MyTABLE`" );
while ( $r = mysql_fetch_assoc( $query ) )
    echo $r['rusText'], '<br />';
echo iconv( 'cp1251', 'utf-8', 'Текст!' );
?>
А теперь пояснение. Не в комментариях, т.к. довольно большие для комментария.
header( 'Content-Type: text/html; charset=utf-8' );
Или средствами HTML1( см. историю редактирования в конце сообщения ):
HTML5
1
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Кодировка, в которой нужно вывести посетителю данные. Она может отличаться от кодировки файла. Главное помнить: если кодировка вывода отличается от кодировки файла, то и выводимые данные также должны быть перекодированы в эту кодировку( кодировку отправляемого заголовка, проще говоря ). Я не сторонник подобного. Лучше сразу указывать одну кодировку, что бы не тратить время еще и на перекодировку в самом скрипте.

mysql_set_charset( 'utf8' );
В этой строке мы указываем серверу MySQL, что данные нужно перекодировать в utf8. В нашем случае это не обязательно( у нас и так БД с такой кодировкой ). Но это пример и хочется охватить как можно больший диапазон задаваемых вопросов пользователями. Эта функция, кстати, заменяет все эти запросы:
PHP
1
2
3
4
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();. В первом параметре этой функции передается текущая кодировка ( кодировка файла ), во втором параметре - желаемая кодировка( кодировка заголовка ) ну а в третьем - сам текст, который необходимо перекодировать.
Вроде бы все написал. Всё, что хотел вернее. Если что-то еще вспомню - обязательно допишу сюда

История редактирования сообщения
1 - добавил еще один способ указания кодировки вывода через meta-тег. ( Дата редактирования: 27.11.10 )
2 - добавил похожую тему. ( Дата редактирования: 27.11.10 )
56
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2010, 14:49
Ответы с готовыми решениями:

БазЫ данных (кодировка)
Поставил кодировку UTF-8 , но русские буквы не появились. Помогите исправит...

Кодировка при выводе данных из базы
Помогите пожалуйста решить проблему!!! У меня есть база данных, которую мне...

Кодировка при получении данных из базы PHPBB3
Доброго всем времени суток! Есть форум на движке PHPBB3 и есть сайт, пытаюсь...

Не работает выборка информации из базы данных. Неправильная кодировка
Здравствуйте. Некорректно работает выборка информации из базы данных (с помощью...

Сортировка данных вывода из базы данных
Доброго времени суток друзья! У меня вот такой вопрос, помогите найти решение....

2
DrobyshevAlex
1173 / 1123 / 94
Регистрация: 31.05.2012
Сообщений: 3,059
10.11.2012, 14:59 2
Хотелось бы ещё кое что сказать про кодировку.

Если у вас выводится текст из базы вот так
Краткая
Значит у вас соединение с БД работает в кодировке UTF-8, а страница открыта в браузере в кодировке cp1251.
Решение:
-либо сохраните страницы в кодировке UTF-8 без BOM и укажите в .htacces для сервера apache кодировку
Код
AddDefaultCharset utf-8
вместо .htaccess можно отправить заголовок с помощью
PHP
1
header('Content-Type: text/html; charset=utf-8');
Это позволить сайту работать в UTF-8 кодировке.

-либо выполните запрос в бд сразу после соединения
SQL
1
SET NAMES 'cp1251';
Это позволит работать сайту в кодировке windows-1251.

Если из базы выводится текст так
�������
то всё с точностью до наоборот


Предпочтительней работать в кодировке UTF-8.
Например вы захотите использовать AJAX, но в некоторых браухерах он работает только с кодировкой UTF-8.
Или функцию json_encode - она тоже работает с кодировкой UTF-8.
Так же в XML лучше использовать эту кодировку.


Если же у вас такой вывод:
???????????
Это скорей всего означает что данных в таблице в кириллице нет вообще.
Часто это из за того, что по умолчанию в MySQL используется кодировка latin1.
И если создать таблицу без явного указания другой кодировки, то она будет создана в latin1. А данная кодировка вообще не работает с кириллицей.
Посмотрите что выводит запрос
SQL
1
SHOW CREATE TABLE `table`;
где table - имя таблицы
Пример вывода
SQL
1
2
3
CREATE TABLE `table` (
  ...
) DEFAULT CHARSET=latin1
Это говорит о том тчо таблица в кодировке latin1 по умолчанию. Можно исправить таким запросом
SQL
1
ALTER TABLE `table`  CONVERT TO CHARACTER SET 'utf8';
15
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16753 / 6644 / 864
Регистрация: 12.06.2012
Сообщений: 19,897
Завершенные тесты: 1
02.04.2013, 21:26 3
Еще изображение одно, возможно, кому-то поможет..
Базы Данных. Кодировка ввода/вывода.
19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2013, 21:26

Кодировка - текст из базы данных отображается в виде набора символов
Текст из базы данных отображается в виде набора символов. Темы похожие видел,...

Нет вывода из базы данных PHP из MYSQL
Добрый день не могу получить данные из таблицы код $query2 =...

Цикл вывода информации из базы данных выводит лишнего
Добрый вечер. Есть несколько циклов. Первый выводит первые три записи из БД....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru