ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

mihail201
Сообщения: 27

ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение mihail201 »

Может тема и не совсем ламерская, но я не знаю куда её еще писать.
Проблема в следующем: Есть скрипт php собственноручно написанный в кодировке cp1251, и есть база данных mysql в такой же кодировке. Все работает, только данные запросов из базы выводятся примерно так -"?????????". Пробовал вводить данные в таблицу utf-8(удалял старую и создавал новую в utf-8). Такая же беда. Данные для таблицы конвертирую из xls файла в csv, так что кодировку могу выбрать любую. Но что-то не помогает пока.

Господа, подскажите, что делать в такой ситуации? Я уже замучился.
P4 3Gz 630(2Mb),ASUS P5LD2,DDR2-667,SATA-2 160Gb,TTLine S1400 budget DVB
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение diesel »

mihail201 писал(а):
21.05.2006 17:23
Может тема и не совсем ламерская, но я не знаю куда её еще писать.
Проблема в следующем: Есть скрипт php собственноручно написанный в кодировке cp1251, и есть база данных mysql в такой же кодировке. Все работает, только данные запросов из базы выводятся примерно так -"?????????". Пробовал вводить данные в таблицу utf-8(удалял старую и создавал новую в utf-8). Такая же беда. Данные для таблицы конвертирую из xls файла в csv, так что кодировку могу выбрать любую. Но что-то не помогает пока.

Господа, подскажите, что делать в такой ситуации? Я уже замучился.

В MYSQL начиная с версии 4.1 можно задавать кодировки на уровне сервера, на уровне базы данных, на уровне таблицы и на уровне отдельных строк.

1. Сервер может быть запущен с параметром --default-charset-set
2. база данных: ALTER DATABASE <имя БД> DEFAULT CHARACTER SET charset;
3. таблица: ALTER TABLE <имя таблицы> CHARACTER SET = charset; (или тоже самое при CREATE TABLE)
3. столбцы: <имя столбца> CHAR(..) CHARACTER SET charset
4. строковые константы можно преобразовать в кодировку вот так: __charset строка

любая строка может быть преобразована в определенную кодировку при помощи функции CONVERT.

ЗЫ: более подробно написано у Дюбуа - перепечатывать весь текст долго. :) :) :)
Спасибо сказали:
mihail201
Сообщения: 27

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение mihail201 »

diesel писал(а):
21.05.2006 20:56
mihail201 писал(а):
21.05.2006 17:23

Может тема и не совсем ламерская, но я не знаю куда её еще писать.
Проблема в следующем: Есть скрипт php собственноручно написанный в кодировке cp1251, и есть база данных mysql в такой же кодировке. Все работает, только данные запросов из базы выводятся примерно так -"?????????". Пробовал вводить данные в таблицу utf-8(удалял старую и создавал новую в utf-8). Такая же беда. Данные для таблицы конвертирую из xls файла в csv, так что кодировку могу выбрать любую. Но что-то не помогает пока.

Господа, подскажите, что делать в такой ситуации? Я уже замучился.

В MYSQL начиная с версии 4.1 можно задавать кодировки на уровне сервера, на уровне базы данных, на уровне таблицы и на уровне отдельных строк.

1. Сервер может быть запущен с параметром --default-charset-set
2. база данных: ALTER DATABASE <имя БД> DEFAULT CHARACTER SET charset;
3. таблица: ALTER TABLE <имя таблицы> CHARACTER SET = charset; (или тоже самое при CREATE TABLE)
3. столбцы: <имя столбца> CHAR(..) CHARACTER SET charset
4. строковые константы можно преобразовать в кодировку вот так: __charset строка

любая строка может быть преобразована в определенную кодировку при помощи функции CONVERT.

ЗЫ: более подробно написано у Дюбуа - перепечатывать весь текст долго. :) :) :)

У меня 5. На уровне баз, на уровне таблиц я уже делал. Когда создаешь базу с определенной кодировкой она и на таблицы и строки распространяется. В phpmyadmin я всё это вижу и данные могу читать.
Насчет сервера интересно - попробую, хотя смысла не вижу.
И еще. Где это, у Дюбуа?
P4 3Gz 630(2Mb),ASUS P5LD2,DDR2-667,SATA-2 160Gb,TTLine S1400 budget DVB
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение diesel »

mihail201 писал(а):
21.05.2006 21:03
У меня 5. На уровне баз, на уровне таблиц я уже делал. Когда создаешь базу с определенной кодировкой она и на таблицы и строки распространяется. В phpmyadmin я всё это вижу и данные могу читать.
Насчет сервера интересно - попробую, хотя смысла не вижу.


а phpmyadmin на том же сервере запущен что и нужный скрипт? - если да, и там все правильно видно, то видимо вопросы к скрипту.

mihail201 писал(а):
21.05.2006 21:03
И еще. Где это, у Дюбуа?


Часть 1. Глава 2. и там есть параграф "Использование кодировок"
Спасибо сказали:
mihail201
Сообщения: 27

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение mihail201 »

Вот переменные сервера
mysql variables:
| character_set_client | cp1251
| character_set_connection | cp1251
| character_set_database | cp1251
| character_set_results | cp1251
| character_set_server | cp1251
| character_set_system | utf8
| character_sets_dir | /usr/share/mysql/charsets/
| collation_connection | cp1251_general_ci
| collation_database | cp1251_general_ci || collation_server | cp1251_general_ci

Вот команда создания базы:
CREATE DATABASE `xxx` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_cs

Вот для таблиц:
ALTER TABLE `phone` CHANGE `name` `name` VARCHAR( 200 ) CHARACTER SET cp1251 COLLATE cp1251_general_cs NULL DEFAULT NULL

phpmyadmin находится на локальной машине с установленной Fedora Core 5. Соответственно там же и скрипты тестируются.
Сами скрипты(cp1251) легкие и могу привести часть для работы с базой:
$result = $db->query($query);
$num_results = $result->num_rows;
echo '<p>Найдено: '.$num_results.'</p>';
for ($i=0; $i <$num_results; $i++)
{
$row = $result->fetch_assoc();
echo '<p><strong>'.($i+1).'. Название: ';
echo htmlspecialchars(stripslashes($row['title']));
echo '</strong><br />Имя: ';
echo stripslashes($row['name']); .... и т.д.
Что еще можно посмотреть?
P4 3Gz 630(2Mb),ASUS P5LD2,DDR2-667,SATA-2 160Gb,TTLine S1400 budget DVB
Спасибо сказали:
mihail201
Сообщения: 27

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение mihail201 »

Я так понимаю все здесь в тупике. Перепробовал всё, что знал. Грешу на phpmyadmin, а конкретно на конвертацию csv в mysql. Хотя данные базы после конвертации из phpmyadmin я вижу, но сохранить обратно например в cvs уже не получится - набор непонятных символов. Тоже самое с моими скриптами. Такое впечатление, что это версия mysql такая, потому что в phpmyadmin при выборе языка пишет, что он русский не знает и хранить данные будет в коде символов. Вот эта билиберда мне в cvs и выводится!

Буду пробовать вручную данные вносить - мож пойму где ошибка. Но один :censored: не выход. Их там на 25 Мб!!

Господа админы! Перенесите тему в fedore core. Мож там кто подскажет что. А то уж больно не хочется федору переставлять - привык уже, да и переделывать под себя в другом дистриб. долго придется.
P4 3Gz 630(2Mb),ASUS P5LD2,DDR2-667,SATA-2 160Gb,TTLine S1400 budget DVB
Спасибо сказали:
azat.h
Сообщения: 45

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение azat.h »

Была аналогичная проблема.
Решилась дампом базы и конвертацией дампа в нужную кодировку.
Делал с консоли, из phpmyadmin не пробовал.
Можно с параметром --default-character-set в mysqldump
Спасибо сказали:
Аватара пользователя
Гарыныч
Сообщения: 202
ОС: Gentoo

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение Гарыныч »

Код: Выделить всё

$db->query('SET NAMES CP1251');
$result = $db->query($query);
и т. д.
Может так?
Спасибо сказали:
mihail201
Сообщения: 27

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение mihail201 »

Буду пробовать. Может и выйдет чего. Напишу сюда, чтобы другие не мучались.
P4 3Gz 630(2Mb),ASUS P5LD2,DDR2-667,SATA-2 160Gb,TTLine S1400 budget DVB
Спасибо сказали:
mihail201
Сообщения: 27

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение mihail201 »

Всем спасибо. Подружил.
Помогло $db->query('SET NAMES CP1251');
P4 3Gz 630(2Mb),ASUS P5LD2,DDR2-667,SATA-2 160Gb,TTLine S1400 budget DVB
Спасибо сказали:
mihail201
Сообщения: 27

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение mihail201 »

Вот тут с хостингом проблема возникла - у них понимает только процедурный стиль написания. Вот пример того же кода, тока в процедурном виде:
if (!mysql_connect("host","name","password"))
{
echo 'xxxxxxxxxxxxxxx';
}
mysql_select_db("shatur_phone");
$query = "select * from phone where ".$searchtype." like '%".$searchterm."%'";
$result = mysql_query($query);

Делаю $result = mysql_query('SET NAMES cp1251'); и ничего не выводится( без этой вставки "?????").

Подскажите, если не знает кто.
P4 3Gz 630(2Mb),ASUS P5LD2,DDR2-667,SATA-2 160Gb,TTLine S1400 budget DVB
Спасибо сказали:
Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение nerezus »

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

Делаю $result = mysql_query('SET NAMES cp1251'); и ничего не выводится
а должно?
ICQ 547097
Спасибо сказали:
mihail201
Сообщения: 27

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение mihail201 »

nerezus писал(а):
05.06.2006 18:32
Вот тут с хостингом проблема возникла - у них понимает только процедурный стиль написания.
бред. Возможно, просто PEAR не установлен.

Делаю $result = mysql_query('SET NAMES cp1251'); и ничего не выводится
а должно?

Может и бред, может и не установлен. Но факт - работают только такие, как я показал выше(меня вообще мало интересует, что там установлено, главное, чтобы работало. И я тоже был удивлен.)! Могу адрес дать, чтоб сам попробовал.
Я и спросил как правильно $db->query('SET NAMES CP1251') в процедурном сделать. Можешь помочь - помогай. Нет-нефига не по теме писать. Уж извини, привык к объектно-ориентированному, а хост из-за одной мелкой заминки менять не вижу смысла
P4 3Gz 630(2Mb),ASUS P5LD2,DDR2-667,SATA-2 160Gb,TTLine S1400 budget DVB
Спасибо сказали:
azat.h
Сообщения: 45

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение azat.h »

Какая версия mysql. php установлена у хостера?
Посмотрите http://phpclub.ru/faq/Mysql41Rus, возможно это то что нужно
P.S. SET NAMES работает с mysql>=4.01
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение KiWi »

mihail201 писал(а):
05.06.2006 20:08
nerezus писал(а):
05.06.2006 18:32

Делаю $result = mysql_query('SET NAMES cp1251'); и ничего не выводится
а должно?

Я и спросил как правильно $db->query('SET NAMES CP1251') в процедурном сделать. Можешь помочь - помогай. Нет-нефига не по теме писать. Уж извини, привык к объектно-ориентированному, а хост из-за одной мелкой заминки менять не вижу смысла

Все какие-то агрессивные пошли...
Он, кстати, написал по теме, а если ты не понимаешь смысла написанной строки(хотя бы чуть-чуть), то так бы и сказал.
Присвоение(а именно оно написано выше) ничего и никому выводить не должно(в случае mysql_query и подобных, которые внутри себя никакого вывода не делают).

[телепатические способности]
А где вы в вами любимом объктом подходе присваивается результат set names?

А то у вас, похоже, получается:

Код: Выделить всё

$str = "a";
$str = "b";
echo $str;

С вопрос: а где моё "а"?
[/телепатические способности]
Спасибо сказали:
Аватара пользователя
idler
Сообщения: 133
ОС: Debian Unstable / Gentoo

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение idler »

Во развели опять! Diesel только недавно описывал решение проблеммы!

простое решение:
запускаем консольного клиента,
drop database my_db;
set names cp1251;
create database my_db default charset=cp1251;
source /home/I_am/backups/mydump.sql;
\q


только дамп базы должен быть уже в 1251
далее.....

в скрипте сразу после коннекта ставишь первым запросом все тот же

set names cp1251
Sad, but true: # rm -rf /
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение KiWi »

idler писал(а):
06.06.2006 08:02
Во развели опять! Diesel только недавно описывал решение проблеммы!

простое решение:
запускаем консольного клиента,
drop database my_db;
set names cp1251;
create database my_db default charset=cp1251;
source /home/I_am/backups/mydump.sql;
\q


только дамп базы должен быть уже в 1251
далее.....

в скрипте сразу после коннекта ставишь первым запросом все тот же

set names cp1251

вы всю тему читали?
точно читали?
мы тут уже не про set names, если не заметили.
Спасибо сказали:
mihail201
Сообщения: 27

Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL

Сообщение mihail201 »

IFL писал(а):
05.06.2006 23:25
mihail201 писал(а):
05.06.2006 20:08

nerezus писал(а):
05.06.2006 18:32

Делаю $result = mysql_query('SET NAMES cp1251'); и ничего не выводится
а должно?

Я и спросил как правильно $db->query('SET NAMES CP1251') в процедурном сделать. Можешь помочь - помогай. Нет-нефига не по теме писать. Уж извини, привык к объектно-ориентированному, а хост из-за одной мелкой заминки менять не вижу смысла

Все какие-то агрессивные пошли...
Он, кстати, написал по теме, а если ты не понимаешь смысла написанной строки(хотя бы чуть-чуть), то так бы и сказал.
Присвоение(а именно оно написано выше) ничего и никому выводить не должно(в случае mysql_query и подобных, которые внутри себя никакого вывода не делают).

[телепатические способности]
А где вы в вами любимом объктом подходе присваивается результат set names?

А то у вас, похоже, получается:

Код: Выделить всё

$str = "a";
$str = "b";
echo $str;

С вопрос: а где моё "а"?
[/телепатические способности]

Так я согласен, что так получается. Только решения не знаю. А это предположение было от безысходности! К тому же топик для "новичков", если не ошибаюсь.Просто пробовал все. Ладно, добрые все - буду сам решение искать, хотя уже не надо - другого нормального хостера нашел. Если тока на будущее.


IFL писал(а):
05.06.2006 23:25
mihail201 писал(а):
05.06.2006 20:08

nerezus писал(а):
05.06.2006 18:32

Делаю $result = mysql_query('SET NAMES cp1251'); и ничего не выводится
а должно?

Я и спросил как правильно $db->query('SET NAMES CP1251') в процедурном сделать. Можешь помочь - помогай. Нет-нефига не по теме писать. Уж извини, привык к объектно-ориентированному, а хост из-за одной мелкой заминки менять не вижу смысла

Все какие-то агрессивные пошли...
Он, кстати, написал по теме, а если ты не понимаешь смысла написанной строки(хотя бы чуть-чуть), то так бы и сказал.
Присвоение(а именно оно написано выше) ничего и никому выводить не должно(в случае mysql_query и подобных, которые внутри себя никакого вывода не делают).

[телепатические способности]
А где вы в вами любимом объктом подходе присваивается результат set names?

А то у вас, похоже, получается:

Код: Выделить всё

$str = "a";
$str = "b";
echo $str;

С вопрос: а где моё "а"?
[/телепатические способности]

Так я согласен, что так получается. Только решения не знаю. А это предположение было от безысходности! К тому же топик для "новичков", если не ошибаюсь.Просто пробовал все. Ладно, добрые все - буду сам решение искать, хотя уже не надо - другого нормального хостера нашел. Если тока на будущее.
P4 3Gz 630(2Mb),ASUS P5LD2,DDR2-667,SATA-2 160Gb,TTLine S1400 budget DVB
Спасибо сказали: