1

Тема: Отображение кириллицы

Имеется таблица:

CREATE TABLE IF NOT EXISTS `rus_section` (
...
`keywords` varchar(500) collate utf8_unicode_ci NOT NULL,
....
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

Заносим текст в utf8.
В броузер выводится правильно. в консоли тоже все нормально:   
mysql> select keywords from rus_section where id = '2';
+--------------------+
| keywords           |
+--------------------+
| Кириллица |
+--------------------+

Логично предположить, что MySQL  работает нормально.

Но при поросмотре через phpmyadmin, выдает кракозябры:
keywords
?????????»?»???†?°

Кодировка броузера utf8. 

phpMyAdmin версии 2.11.8.1

Что крутить?

2

Re: Отображение кириллицы

VGreen
Скрипт, которым вы добавляете данные, необходимо поправить таким образом, чтобы он сперва устанавливал корректную кодировку соединения с MySQL.
Если скрипт на PHP, то следует сразу после функции соединения mysql_connect добавить строку:
mysql_query('SET NAMES utf8');

Если не указать скрипту устанавливать кодировку соединения, то она будет браться из глобальных настроек, судя по всему у вас там будет latin1. Глобальную кодировку соединения можно узнать запросом:
SHOW GLOBAL VARIABLES LIKE 'char%';

С консолью осторожнее. Перед использованием необходимо настроить ее на работу в требуемой кодировке.

3

Re: Отображение кириллицы

Ага понял, похоже что, при не правильной кодировке соединения  mysql хранит utf8  в виде последовательности байт, а не символов. Что подтверждается экспериментом, срока в 200 символов обрезается при записи в поле varchar(250).
Скрипт вывода переводит байты обратно в символы и выдает в броузер, создается впечатление что все работает правильно, только myadmin "умничает".
Указание SET NAMES utf8 при вводе и выводе решает проблему.

Спасибо за ответ. ))

4

Re: Отображение кириллицы

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

Неумение большого количества скриптов и программ работать с кодировками соединения - это большая беда. Но это не беда MySQL, а недочеты разработчиков этих скриптов и программ.

5 (изменено: nostromo, 2010-02-06 15:28:39)

Re: Отображение кириллицы

Уважаемые Господа.
Не стал создавать новую ветку. Прошу ПОМОЩИ!!!!!
Установил РМА. Все вроде симпатично, но вот с кодировками такая лажа, что сам разобраться не могу. И в РМА и  на сайте и в мускуле вся кирилица ????????????????????????????? Ну, что надо подправить, подскажите, ну сил не уже никаких. Все сравнения и представления cp1251_general_ci. сайт написан в той-же кодиировке, но везде???????

При загрузке РМА внизу пишется:

Версия клиентской библиотеки MySQL (4.1.7) отличается от версии установленного MySQL-сервера (5.0.6). Это может привести к некорректной работе.

Но мне кажется, что к кодировке это не имеет никакого отношения. Пожалуйста помогите.:(

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Большое спасибо всем. Проблему решил.

6

Re: Отображение кириллицы

Узнал  с вашей помощью вот такое:
Команда:
SHOW GLOBAL VARIABLES LIKE 'char%'
Результат:
Variable_name     Value
character_set_client    latin1
character_set_connection    latin1
character_set_database    latin1
character_set_filesystem    binary
character_set_results    latin1
character_set_server    latin1
character_set_system    utf8
character_sets_dir    L:\xampp\xampp\mysql\share\charsets\
Как всё настроить так, чтобы избежать каракуль? Бо есть один движок, и май админ ни в какой кодировке не хочет воспринимать базу данных. При попытке залить в ручную пишет:
Ошибка

SQL-запрос:

INSERT INTO SS_categories( categoryID, name, parent, products_count, description, picture, products_count_admin )
VALUES ( 1, 'Автомобили', 0, 7, 'Здесь собраны несколько представителей лучших автомобилей мира', 'C1_jaguar.jpg', 0 ) ;


Ответ MySQL: 
#1146 - Table 'nedvig_map.ss_categories' doesn't exist

При установке скриптом заливает, но все тексты получаются ????????? ?? ????????? в виде знаков вопросов.

7

Re: Отображение кириллицы

Ruskat
В конфигурационный файл MySQL (my.ini или my.cnf) в разделе [mysqld] добавьте строку:
[mono]init-connect="SET NAMES cp1251"[/mono]

Это в том случае, если скрипт в кодировке windows-1251.

8

Re: Отображение кириллицы

Hanut, внёс  данную команду в  my.ini, но опосля апач отказался запускаться. Убрал "нововведение" - запустился.:| Я вот думаю, может там где защита стоит???

9

Re: Отображение кириллицы

Ruskat
Не могу сказать причину. Apache вобще-то здесь ни при чем должен быть.

Обратите внимание на данную статью: http://php-myadmin.ru/learning/instrument-intro.html
Возможно вам будет лучше установить веб-сервер с ее помощью, чем мучиться с Xampp.

10

Re: Отображение кириллицы

Здравствуйте! Ну вот, еще один новичок в моем лице с той же головной болью smile. Только я новичок еще больше, чем все остальные )). ПРоблема у меня в том, что я купил флэшевый шаблон фотосайта у буржуев. Шаблон работает с MySQL+PHP и изначально не поддерживал русский язык, так как буржуям невдомек про Embed и кириллицу. Пришлось декомпилить все самому и править. Теперь самое интересное. Флэш берет например тексты меню из БД мускула, а в мускул они вносятся через пхп админку. БД выдает следующее:
Variable_name    Value
character_set_client    latin1
character_set_connection    latin1
character_set_database    latin1
character_set_filesystem    binary
character_set_results    latin1
character_set_server    latin1
character_set_system    utf8
character_sets_dir    /usr/share/mysql/charsets/
Все таблицы бд были в latin1. Путем слива дампа и корректировки кодировок, перевел некоторые таблицы в утф8. Проблема сейчас в том, что загрузка текстов из админки в БД на русском происходит нормально, флэшем интерпретируется правильно, а вот в PhPMyAdmin в полях базы юникодовские кракозябры.  В скрипт соединения с бд я добавил:
mysql_query("SET NAMES 'utf8'");
К тому же, попытался вставить метатеги для странички через админку - тут уже не получается, заголовок страницы в браузере выходит кракозябрами. Прописал напрямую в базе по русски - заголовок выходит по русски, а вот метатеги вот так:
?????, ????????????????????????, ???????&sup2
В общем, перепробовал уже кучу способов, но ничего не помогает. Я пытаюсь все привести к общему знаменателю, в виде кодировки utf-8, правильно ли я делаю? Спасибо за помощь заранее!

11

Re: Отображение кириллицы

4EVERCooL
Лучше всего начинать без данных, тогда будет проще.

1) Делаем дамп таблиц (данных в кириллице быть не должно), или используем имеющийся и правим в нем все latin1 на utf8 (кодировки и сравнения). Затем импортируем этот дамп, все таблицы теперь будут в utf8.
2) Поиском по всем файлам скрипта надо найти вызов функции mysql_connect и добавить после нее [mono]mysql_query("SET NAMES 'utf8'");[/mono]
3) Мета теги кодировки страниц должны быть utf-8.
4) Запишите данные из админки  в БД и проверьте, чтобы в phpMyAdmin был читаемый русский текст.

Если не получится, то проделайте все то же самое, но замените utf8 на cp1251, возможно есть ограничения для многобайтных кодировок в скрипте.

Как с кодировками работает флеш, я не знаю, поэтому не уверен, что все получится. В любом случае, сохраните все исходные файлы и дамп БД.

12

Re: Отображение кириллицы

Variable_name    Value
character_set_client    latin1
character_set_connection    latin1
character_set_database    latin1
character_set_filesystem    binary
character_set_results    latin1
character_set_server    latin1
character_set_system    utf8

Токая же проблемка была с отображение мета данных, вручную все в правил на utf8_general_ci, после чего руский текст начал нормально отображать, но это:
Variable_name    Value
character_set_client    latin1
character_set_connection    latin1
character_set_database    latin1
character_set_filesystem    binary
character_set_results    latin1
character_set_server    latin1
character_set_system    utf8

так и осталось может подскажете в пошаговом желательно рижиме_) как это можно убрать исправить  roll

13 (изменено: DmitryV, 2011-01-02 11:03:26)

Re: Отображение кириллицы

Откройте для редактирования файл "my.ini".
1 - В раздел [client], после строки:
port=3306
добавьте:

character-sets-dir="Ваш путь к /mysql/share/charsets"

2 - в разделе :
[mysql]
укажите:

default-character-set=cp1251

3 - в разделе:
[mysqld]
укажите:

character-sets-dir="Ваш путь к /mysql/share/charsets"
init-connect="SET NAMES cp1251" 

character-set-server=cp1251

далее все необходимые в скипте значения кодировок если они будут отличны от заданных по умолчанию, задавайте в тексте своих скриптов после соединения с сервером mysql выполнив запрос вида:

mysql_query('SET NAMES нужная кодировка');

нопример для utf8:

mysql_query('SET NAMES utf8');

14

Re: Отображение кириллицы

у меня похожая проблема в phpmyadmin русские символы отображаются как нечто очень страшное, на выходе через скрипт всё норм. попробовал вставить в  скрипт mysql_query('SET NAMES utf8'); после этих изменений вообще русские символы перестали заносится в БД
кодировка MySQL при установке cp1251_general_ci
кодировка БД utf8_unicode_ci

15

Re: Отображение кириллицы

MikRise сказал:

кодировка MySQL при установке cp1251_general_ci
кодировка БД utf8_unicode_ci

В таком случае надо сперва перекодировать данные в нормальный вид и только затем добавлять SET NAMES.

Если нужна помощь в перекодировке, то сделайте дамп одной из таблиц содержащую строку с кириллицей и вышлите его на hanut@php-myadmin.ru

16

Re: Отображение кириллицы

у меня БД ещё в тестовом варианте и данных там ещё никаких нет(только тестовые записи),  подскажите пожалуйста в какой кодировке нужно создавать БД и мот какие настройки кодировок поменять в самом MySQL

17

Re: Отображение кириллицы

MikRise сказал:

в какой кодировке нужно создавать БД

Все зависит от кодировки страниц сайта. Если сайт будет в utf-8, то таблицы БД должны иметь сравнение utf8_general_ci. Необходимо быть внимательным к кодировкам файлов скриптов, сами файлы тоже должны быть сохранены в кодировке utf8. И, разумеется, необходимо после функции соединения с MySQL mysql_connect прописать SET NAMES.

18

Re: Отображение кириллицы

я так думаю у меня трабл в настройках Сервеного ПО, т.к сразу я писал и тестил скрипты на локальном компе, при помощи денвера(Denwer3_PHP52_2010-11-07 apache 2.2.4  mysql 5.1.40  pma3.2.3) и там всё было норм, а вот на серваке
я ставил всю сборку сам (PHP 5.2.9 apache2.2.17  mysql 5.5.11 pma 3.3.10) но так как я ещё мало этим занимаюсь может где пропустил какие то настройки.

19

Re: Отображение кириллицы

MikRise сказал:

но так как я ещё мало этим занимаюсь может где пропустил какие то настройки

Решения даны сверху, если вы их все опробовали, то хотя бы скажите какой получаете результат.

Если PHP отдает страницы в неверной кодировке, то можно решить это создав в корне хоста файл .htaccess и добавив в него строку:

PHP_VALUE default_charset utf-8

Все эти решения проблему кодировок снимают при любых настройках веб-сервера.

20

Re: Отображение кириллицы

Hanut сказал:

VGreen
Глобальную кодировку соединения можно узнать запросом:
SHOW GLOBAL VARIABLES LIKE 'char%';

Простите, а ку да эту строчку втыкать?

21

Re: Отображение кириллицы

Lexan сказал:

Простите, а ку да эту строчку втыкать?

В phpMyAdmin есть поле выполнения SQL запроса - прямо там.