Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кодировка при выборке из MySQL, В базе UTF-8, на выходе непонятно что 
:(
    Опции темы
turing
Дата 5.11.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Приветствую вас, коллеги.

В базе хранятся данные в кодировке utf-8. Когда я гляжу через EMS SQL Manager, вижу там такое знаете РљРѕСЃРјРѕСЃ справа. Через phpmyadmin вижу Силинский Александр. Чарсет для таблицы прописан utf8.

У меня есть девелоперский сервер, который дома, и продакшн, который хрен знает где, и доступ есть только к одной базе и фтп-каталогу, куда льётся сайт. Сайт тоже в utf-8, надо сказать.

Так вот, на моём девелоперском сервере всё отдаётся как надо, то есть получается читаемая страничка. А вот с продакшна приходит, видимо, перекодированное, потому что выглядит примерно как ?????�???????????? ???�?�?????�??????.

Обратите внимание: база одна и та же, она на продакшн-сервере лежит. Вот что даёт SHOW VARIABLES LIKE '%character_set%':
Код

character_set_client           latin1                                                                                               
character_set_connection       latin1                                                                                               
character_set_database         cp1251                                                                                               
character_set_results          latin1                                                                                               
character_set_server           cp1251                                                                                               
character_set_system           utf8                                                                                                 
character_sets_dir             /usr/local/share/mysql/charsets/                                                                     

Вопрос: как это происходит и как с этим бороться?

Это сообщение отредактировал(а) turing - 5.11.2009, 13:53
PM MAIL   Вверх
Ипатьев
Дата 5.11.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 3
Всего: 37



что значит "приходит"?
если зайти на продакшен, там отображается все нормально?

Добавлено через 8 минут и 2 секунды
на продакшене mysql_query("SET NAMES utf8"); сразу после коннекта


PM MAIL   Вверх
turing
Дата 6.11.2009, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Приходит с продакшна — значит отображается на html-странице, сгенерированной тем php, который стоит на продакшне.

А что вы подразумеваете под «зайти на продакшн»?

mysql_query("SET NAMES utf8"); сделал, теперь и с продакшна, и с локального приходит Безумные этнографы (раньше с прода приходили вопросы, а с локального нормальные буквы).

Мне бы очень хотелось понять, где загвоздка. Может, у меня база неправильно наполнена? Я импортировал CSV в кодировке utf-8. Да и хранится вроде в ней.
PM MAIL   Вверх
Ипатьев
Дата 6.11.2009, 05:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 3
Всего: 37



Цитата(turing @  6.11.2009,  01:15 Найти цитируемый пост)
Может, у меня база неправильно наполнена?

может. 
создавая таблицы, надо было кодировку указывать
чтобы она была utf8, а не 1251
PM MAIL   Вверх
turing
Дата 6.11.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Ну, вот DDL:

Код

CREATE TABLE `results_autumn` (
  `name` varchar(40) NOT NULL default '',
  `q1` float(9,2) default NULL,
  `q2` float(9,2) default NULL,
  `q3` float(9,2) default NULL,
  `q4` float(9,2) default NULL,
  `q5` float(9,2) default NULL,
  `q6` float(9,2) default NULL,
  `q7` float(9,2) default NULL,
  `q8` float(9,2) default NULL,
  `sum` float(9,2) default NULL,
  `finished` int(11) default NULL,
  `total` float(9,2) default NULL,
  `place` int(11) default NULL,
  PRIMARY KEY  (`name`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='InnoDB free: 0 kB';


Вроде чарсет указан…
PM MAIL   Вверх
krypt3r
Дата 6.11.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 1
Всего: 16



Если после SET NAMES utf8 у вас строки нормально не отображаются, значит,  не в utf8 записаны они
PM MAIL   Вверх
turing
Дата 6.11.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Я импортировал CSV в кодировке UTF-8. Сейчас экспортирую, получаю нормальную CSV в той же кодировке, всё читаемо. 
Как же в базе может быть не UTF?

Это сообщение отредактировал(а) turing - 6.11.2009, 17:32
PM MAIL   Вверх
Ипатьев
Дата 6.11.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 3
Всего: 37



Легко. База же не знает, что CSV в кодировке UTF-8
PM MAIL   Вверх
turing
Дата 6.11.2009, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Вот не могу понять. В базу импортирую в UTF8. Из базы экспортирую в UTF8. При этом в базе что? Разве не UTF8?
И самое непонятное: почему на одном сервере данные выглядят нормально, а на другом — нет.
PM MAIL   Вверх
Ипатьев
Дата 6.11.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 3
Всего: 37



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

Это сообщение отредактировал(а) Ипатьев - 6.11.2009, 20:55
PM MAIL   Вверх
turing
Дата 28.12.2009, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Вопрос так и не решён. Напомню суть проблемы. 

Есть два web-сервера с php. 
Есть сервер mysql. 
В БД mysql хранятся строки в кодировке utf8. 
Collation таблиц и полей указан utf8. 

Когда я делаю запрос на выборку через php-скрипт на первом сервере, а потом вывожу выбранные данные в браузер, то вижу нормальный русский текст.

Когда я делаю запрос на выборку через php-скрипт на втором сервере, а потом вывожу выбранные данные в браузер, то вижу знаки вопроса вместо русских букв. Причём этих знаков в двое больше, чем должно быть букв. Латинские буквы, цифры и знаки препинания отображаются нормально.

SET NAMES никакого эффекта не имеет.

Подскажите, где копать?
PM MAIL   Вверх
skyboy
Дата 29.12.2009, 01:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(turing @  28.12.2009,  22:25 Найти цитируемый пост)
SET NAMES никакого эффекта не имеет.

set names надо делать не только перед выборкой, но и перед вставкой.
раз у тебя 
Цитата(turing @  5.11.2009,  12:39 Найти цитируемый пост)

character_set_client           latin1
character_set_connection       latin1  

и проблемы при выводе, то делаю заявление провидца: при импорте из CSV данных в кодирове utf-8 "set names utf8" вызван не был. из-за чего сервер по причине конфигурации "character_set_client           latin1" воспринял твои УТФ8-ные данные как latin1. и перекодировал.
кроем кодировки клиент/соединения, которое можно изменить при помощи выполнения запроса "set names", есть ещё и указание кодирвки, с которой браузер отображает страницу. вот у тебя есть фраза 
Цитата(turing @  28.12.2009,  22:25 Найти цитируемый пост)
Когда я делаю запрос на выборку через php-скрипт на втором сервере, а потом вывожу выбранные данные в браузер

то не указано, в какой кодировке у тебя происходит отображение в браузере. Отправляешь ли ты заголовок Content-Type c указанием кодировки, или задаешь кодировку значением тега <meta http-equiv="content-type" не знает никто, кроме тебя. в принципе, можешь и дальше партизанить, только учти, что у тебя есть:
кодировка данных, кодировка хранения(то, что можно определить для базы, таблицы и поля в отдельности), кодировка подключения и кодировка результата запроса(их перечисляю вместе, потому как set names устанавливает и то, и то) и кодировка отображение браузером.
если на каком-то этапе(запись в БД, чтение из БД и вывод) происходит рассогласование кодировки в настройках и кодировки данных, то получаются вот такие вот неприятные вещи.
PM MAIL   Вверх
turing
Дата 29.12.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Прописал SET NAMES, теперь он выполняется при каждом коннекте к базе. Вручную через веб-интерфейс перебил все текстовые поля (их пока немного). Картина несколько изменилась. Теперь при обращении к «кривому» серверу вместо русских букв в браузере символы <?> (знак вопроса в чёрном квадрате). С «нормального» сервера опять получаю нормальные буквы.

Насчёт Content-type. У меня кодировка задаётся в meta-тэге. «Кривой» сервер отдаёт заголовок Content-Type: text/html; charset=utf-8, «нормальный» отдаёт заголовок Content-Type: text/html.

PM MAIL   Вверх
skyboy
Дата 29.12.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



Цитата(turing @  29.12.2009,  15:48 Найти цитируемый пост)
Прописал SET NAMES

с какой кодировкой? utf-8?

Цитата(turing @  29.12.2009,  15:48 Найти цитируемый пост)
Насчёт Content-type. У меня кодировка задаётся в meta-тэге. «Кривой» сервер отдаёт заголовок Content-Type: text/html; charset=utf-8, «нормальный» отдаёт заголовок Content-Type: text/html.

в браузере включено автоопределение кодировки?
PM MAIL   Вверх
Ипатьев
Дата 30.12.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 3
Всего: 37



Цитата(turing @  29.12.2009,  16:48 Найти цитируемый пост)
Насчёт Content-type. У меня кодировка задаётся в meta-тэге.

А что - в исходник страницы никак не заглянуть? 
Чтобы вообще исключить такой фактор, как кодировка отдаваемого ресурса. 

Это сообщение отредактировал(а) Ипатьев - 30.12.2009, 12:04
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.