ПОМОГИТЕ Подружить кодировки PHP и MYSQL
Модератор: Bizdelnick
-
mihail201
- Сообщения: 27
ПОМОГИТЕ Подружить кодировки PHP и MYSQL
Может тема и не совсем ламерская, но я не знаю куда её еще писать.
Проблема в следующем: Есть скрипт php собственноручно написанный в кодировке cp1251, и есть база данных mysql в такой же кодировке. Все работает, только данные запросов из базы выводятся примерно так -"?????????". Пробовал вводить данные в таблицу utf-8(удалял старую и создавал новую в utf-8). Такая же беда. Данные для таблицы конвертирую из xls файла в csv, так что кодировку могу выбрать любую. Но что-то не помогает пока.
Господа, подскажите, что делать в такой ситуации? Я уже замучился.
Проблема в следующем: Есть скрипт 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
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
diesel писал(а): ↑21.05.2006 20:56mihail201 писал(а): ↑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
а phpmyadmin на том же сервере запущен что и нужный скрипт? - если да, и там все правильно видно, то видимо вопросы к скрипту.
Часть 1. Глава 2. и там есть параграф "Использование кодировок"
-
mihail201
- Сообщения: 27
Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL
Вот переменные сервера
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']); .... и т.д.
Что еще можно посмотреть?
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
Я так понимаю все здесь в тупике. Перепробовал всё, что знал. Грешу на phpmyadmin, а конкретно на конвертацию csv в mysql. Хотя данные базы после конвертации из phpmyadmin я вижу, но сохранить обратно например в cvs уже не получится - набор непонятных символов. Тоже самое с моими скриптами. Такое впечатление, что это версия mysql такая, потому что в phpmyadmin при выборе языка пишет, что он русский не знает и хранить данные будет в коде символов. Вот эта билиберда мне в cvs и выводится!
Буду пробовать вручную данные вносить - мож пойму где ошибка. Но один
не выход. Их там на 25 Мб!!
Господа админы! Перенесите тему в fedore core. Мож там кто подскажет что. А то уж больно не хочется федору переставлять - привык уже, да и переделывать под себя в другом дистриб. долго придется.
Буду пробовать вручную данные вносить - мож пойму где ошибка. Но один
Господа админы! Перенесите тему в fedore core. Мож там кто подскажет что. А то уж больно не хочется федору переставлять - привык уже, да и переделывать под себя в другом дистриб. долго придется.
P4 3Gz 630(2Mb),ASUS P5LD2,DDR2-667,SATA-2 160Gb,TTLine S1400 budget DVB
-
azat.h
- Сообщения: 45
Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL
Была аналогичная проблема.
Решилась дампом базы и конвертацией дампа в нужную кодировку.
Делал с консоли, из phpmyadmin не пробовал.
Можно с параметром --default-character-set в mysqldump
Решилась дампом базы и конвертацией дампа в нужную кодировку.
Делал с консоли, из phpmyadmin не пробовал.
Можно с параметром --default-character-set в mysqldump
-
Гарыныч
- Сообщения: 202
- ОС: Gentoo
Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL
Код: Выделить всё
$db->query('SET NAMES CP1251');
$result = $db->query($query);
и т. д.-
mihail201
- Сообщения: 27
Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL
Буду пробовать. Может и выйдет чего. Напишу сюда, чтобы другие не мучались.
P4 3Gz 630(2Mb),ASUS P5LD2,DDR2-667,SATA-2 160Gb,TTLine S1400 budget DVB
-
mihail201
- Сообщения: 27
Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL
Всем спасибо. Подружил.
Помогло $db->query('SET NAMES CP1251');
Помогло $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
Вот тут с хостингом проблема возникла - у них понимает только процедурный стиль написания. Вот пример того же кода, тока в процедурном виде:
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'); и ничего не выводится( без этой вставки "?????").
Подскажите, если не знает кто.
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
бред. Возможно, просто PEAR не установлен.Вот тут с хостингом проблема возникла - у них понимает только процедурный стиль написания.
а должно?Делаю $result = mysql_query('SET NAMES cp1251'); и ничего не выводится
ICQ 547097
-
mihail201
- Сообщения: 27
Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL
Может и бред, может и не установлен. Но факт - работают только такие, как я показал выше(меня вообще мало интересует, что там установлено, главное, чтобы работало. И я тоже был удивлен.)! Могу адрес дать, чтоб сам попробовал.
Я и спросил как правильно $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
Какая версия mysql. php установлена у хостера?
Посмотрите http://phpclub.ru/faq/Mysql41Rus, возможно это то что нужно
P.S. SET NAMES работает с mysql>=4.01
Посмотрите http://phpclub.ru/faq/Mysql41Rus, возможно это то что нужно
P.S. SET NAMES работает с mysql>=4.01
-
KiWi
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL
Все какие-то агрессивные пошли...
Он, кстати, написал по теме, а если ты не понимаешь смысла написанной строки(хотя бы чуть-чуть), то так бы и сказал.
Присвоение(а именно оно написано выше) ничего и никому выводить не должно(в случае mysql_query и подобных, которые внутри себя никакого вывода не делают).
[телепатические способности]
А где вы в вами любимом объктом подходе присваивается результат set names?
А то у вас, похоже, получается:
Код: Выделить всё
$str = "a";
$str = "b";
echo $str;С вопрос: а где моё "а"?
[/телепатические способности]
-
idler
- Сообщения: 133
- ОС: Debian Unstable / Gentoo
Re: ПОМОГИТЕ Подружить кодировки PHP и MYSQL
Во развели опять! 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
простое решение:
запускаем консольного клиента,
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
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
IFL писал(а): ↑05.06.2006 23:25
Все какие-то агрессивные пошли...
Он, кстати, написал по теме, а если ты не понимаешь смысла написанной строки(хотя бы чуть-чуть), то так бы и сказал.
Присвоение(а именно оно написано выше) ничего и никому выводить не должно(в случае mysql_query и подобных, которые внутри себя никакого вывода не делают).
[телепатические способности]
А где вы в вами любимом объктом подходе присваивается результат set names?
А то у вас, похоже, получается:
Код: Выделить всё
$str = "a"; $str = "b"; echo $str;
С вопрос: а где моё "а"?
[/телепатические способности]
Так я согласен, что так получается. Только решения не знаю. А это предположение было от безысходности! К тому же топик для "новичков", если не ошибаюсь.Просто пробовал все. Ладно, добрые все - буду сам решение искать, хотя уже не надо - другого нормального хостера нашел. Если тока на будущее.
IFL писал(а): ↑05.06.2006 23:25
Все какие-то агрессивные пошли...
Он, кстати, написал по теме, а если ты не понимаешь смысла написанной строки(хотя бы чуть-чуть), то так бы и сказал.
Присвоение(а именно оно написано выше) ничего и никому выводить не должно(в случае 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