Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/793: Рейтинг темы: голосов - 793, средняя оценка - 4.64
 Аватар для romchiksoad
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2

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

27.11.2010, 14:49. Показов 144566. Ответов 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 )
57
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.11.2010, 14:49
Ответы с готовыми решениями:

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

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

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

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

Если у вас выводится текст из базы вот так
Краткая
Значит у вас соединение с БД работает в кодировке UTF-8, а страница открыта в браузере в кодировке cp1251.
Решение:
-либо сохраните страницы в кодировке UTF-8 без BOM и укажите в .htacces для сервера apache кодировку
Code
1
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
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.04.2013, 21:26
Еще изображение одно, возможно, кому-то поможет..
19
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.04.2013, 21:26
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Закрытая тема Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru