Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.97/680: Рейтинг темы: голосов - 680, средняя оценка - 4.97
1953 / 792 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
1

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

27.11.2010, 14:49. Показов 130553. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2010, 14:49
Ответы с готовыми решениями:

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

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

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

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

2
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
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
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16827 / 6705 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.04.2013, 21:26 3
Еще изображение одно, возможно, кому-то поможет..
Базы Данных. Кодировка ввода/вывода.
19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.04.2013, 21:26

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

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

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

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

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


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

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

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