Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > кодировка mysql


Автор: usverishe 5.9.2006, 14:04
Добрый день, есть такая проблема, текст записываеться и выводиться из бд в виде непонятных кракокозябл.
кодировка на странице windows-1251 в бд cp1251-general_ci.
Вся странность в том, что если поставить вид страницы в UTF-8, всё нормально.

Убедительная просьба, в поиск не посылать, перепробовал всё и 

Код

mysql_query ("set NAMES cp1251");

и 
Код

mysql_query("SET CHARACTER SET cp1251");


 smile 

помогите новичку плз.

Автор: shopen 5.9.2006, 14:14
а вот так пробовал?
Код

mysql_query('SET character_set_results="cp1251"');



Автор: usverishe 5.9.2006, 14:18
shopen,  пробовал, и так:

Код

mysql_query("set character_set_client='cp1251'");
mysql_query("set character_set_results='cp1251'");
mysql_query("set collation_connection='cp1251_general_ci'");

пробовал...  smile 

Автор: shopen 5.9.2006, 14:27
ты базу импортировал с локально хоста или как?

Автор: usverishe 5.9.2006, 14:31
она пока там и лежит.
....[censored 6] фигня какая-то но всё само-собой исправилось....
хрен знает что происходит?!

Автор: shopen 5.9.2006, 14:34
ну и гуд smile а вот при переезде на хостинг с локального хоста, у тебя это проблема ещё встанет, если хост не заточен под 1251 кодировку. smile

Автор: usverishe 5.9.2006, 14:39
И как её решить? (на будушее)

Автор: shopen 5.9.2006, 15:05
при импорте через пхпадмин указываешь кодировку 1251 и после соединения с базой пишешь mysql_query('SET character_set_results="cp1251"');
такая вот общая схема

Автор: usverishe 5.9.2006, 15:12
спасибо за совет, а проблема вновь вернулась и появляеться через раз?!?!? т.е. один раз нормальный текст, один раз нет, самое обидное, что немогу понять что меняеться!

Автор: shopen 5.9.2006, 15:20
думаю если через раз появляется, значит проблема не в базе.
ты под каким браузером смотришь? попробуй на разных

Автор: usverishe 5.9.2006, 15:26
попробовал под лисой, и оперой та-же фигня  smile 

Автор: shopen 5.9.2006, 16:22
ну блин, незнаю, через пхп админ данные в таблицах нормально отображаются?
и где ты пишешь: mysql_query('SET character_set_results="cp1251"'); ?
сразу после соединения с базой?

Автор: Гриша 5.9.2006, 21:42
http://phpclub.ru/faq/wakka.php?wakka=MySql&v=mrb

Автор: usverishe 5.9.2006, 22:37
Гриша, спасибо конечно, но я всегда пользуюсь я.ру перед тем, как задать вопрос.  smile 

shopen, в phpmyadmin те-же крокозябли smile 

mysql_query('SET character_set_results="cp1251"');
пищу сразу после конекта, может писать после выбора бд?

Автор: -=Ustas=- 5.9.2006, 23:22
Если ты делаешь дамп с локли, то нафиг, никаких всяких там пхпмайадминов!!!
Код

mysqldump -u user -p database -Q -r dump.sql --default-character-set=cp1251


Теперь. Сервак твой или нет? Если нет, то желательно было бы узнать настройки my.cnf

Как ты заливаешь этот дамп? Шел-доступ есть?

Автор: usverishe 6.9.2006, 13:36
-=Ustas=- , shopen  Спасибо учту на будуюшее,

косяк оказался в самой странице, стоило убрать meta с charset, и всё заработало smile 

Автор: MaliceInWonderland 19.4.2007, 23:54
аналогичная проблема. 

кодировка базы MySQL: cp1251


php
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
mysql_query('SET NAMES "cp1251"')

итог: ????­?®? ?¤ ??

mysql_query('SET character_set_results="cp1251"')+ 
Цитата

убрать meta с charset, и всё заработало

пробовала. 

Автор: -=Ustas=- 20.4.2007, 08:41
А если так:
Код

mysql_query( 'SET NAMES cp1251' ) or die( mysql_error() );

Автор: capitan 20.4.2007, 15:04
Народ, не подключайтесь к базе с рутовым паролем. Создайте пользователя с урезанными правами, перегрузите мускул и будет Вам счастье. 
Цитата

MySQL 4.1 на внутреннем уровне работает с кодировкой UTF-8 и перекодирует результат в требуемую форму (в нашем случае windows-1251) непосредственно перед передачей его клиенту (т.е. скрипту). В некоторых случаях оказывается, что кодировка клиента (скрипта) «не доходит» до MySQL. Соответственно, сервер передает «вопросики». Можно применить одно из следующих решений. 1. Вписать в скрипт что-то вроде: mysql_query(«SET NAMES cp1251») . Это надо делать сразу же после подключения к MySQL. Проблема исчезнет (хотя правильнее будет установить переменные сессии). 2. Вписать init-connect="SET NAMES cp1251" в my.ini и перезапустить MySQL. Однако это сработает только для соединений, которые проходят НЕ под root-пользователем. Скрипты, коннектящиеся к базе под root, по-прежнему будут получать неверную кодировку. Лучше всего будет все-таки завести новую базу и пользователя и забыть о проблеме подключаясь через его аккаунт. Чтобы диагностировать проблему, выполните в скрипте запрос SHOW VARIABLES LIKE 'char%'.

Автор: MaliceInWonderland 20.4.2007, 19:06
Цитата

mysql_query( 'SET NAMES cp1251' ) or die( mysql_error() );

сообщения об ошибке не выдает.
Цитата

‘????­?®? 


залила базу еще раз. установила кодировку MySQL: cp1251

заработало. но при условии:
<meta http-equiv="Content-Type" content="text/html; charset=cp866">

почему DOS?

Автор: MaliceInWonderland 20.4.2007, 22:47


cp1251 устанавливаю для конкретной базы.
alter DATABASE db DEFAULT CHARACTER SET cp1251.

думаю проблема здесь:
пытаюсь изменить кодировку
Цитата

SET character_set_client= cp1251; 
SET character_set_connection =cp1251; 
SET character_set_database =cp1251; 
SET character_set_results =cp1251; 
SET character_set_server =cp1251; 
SET character_set_system =utf8;


проверяю SHOW VARIABLES LIKE `char%';
кодировка изменилась с latin1 на cp1251.

прописываю В my.cnf MYSQL 4.1.
[mysqld]
default-character-set=cp1251

перезапускаю mysql command line client.

изменения не сохранились. HOW VARIABLES LIKE `char%' выдает latin1







Автор: INHazeR 22.4.2007, 19:34
Нашел вот такое решение проблемы:

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

Итак, по умолчанию для всех обьектов базы устанавливается кодировка latin1, и если в поле с такой кодировкой запихнуть русские данные, то вместо символов Вы будете видеть знаки вопроса. Для избежания данной проблемы достаточно установить при создании базы нужную Вам кодировку:

CREATE DATABASE yourbase CHARACTER SET ‘cp1251′

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

ALTER TABLE students CHANGE name name varchar(100) CHARACTER SET ‘cp1251′

Типы полей надо оставить прежними, нужно только изменить кодировку(CHARACTER SET).

Для корректной работы с кодировками осталась одна вещь - после установления соединения необходимо указать требуемую кодировку с помощью запроса:

SET NAMES cp1251;

Кстати, полный список кодировок, которые поддерживает Ваш сервер, можно получить с помощью комманды

SHOW CHARACTER SET;

Таким образом, моя БД в cp1251, страница тоже в cp1251:
Код

<meta http-equiv="Content-Type" content="text/html; charset=cp1251" />


Результат - непонятные символы. Если сменить кодировку страницы на cp866, то нормально отображаются результаты запроса из БД (в правильной кодировке), но вся остальная страница, разумеется, отображается неверно.
Итак, может ли кто-нибудь дать этому внятное объяснение? smile 

Автор: Glip 22.4.2007, 21:37
есть вероятность что перекодирует веб сервер.

http://www.faqs.org/rfcs/rfc2616.html
Код

3.4 Character Sets

   HTTP uses the same definition of the term "character set" as that
   described for MIME:

точнее кодировка задается в заголовке формируемом веб сервером.


у apache можно почитать про AddDefaultCharset
у nginx -  charset

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)