|
|
|
| Прошу помощи. Проблема с записью информации в MySQL из программ на PHP. Русские символы записываются в базу данных в виде абракадабры, обратно же считываются так, будто бы никаких ошибок и не было, нормальным текстом. В базе данных выставлена кодировка w-cp1251. Также проблемы с записью строк в поле с типом "дата и время" . Записываемая строка не воспринимается правильно, и вместо записываемой даты сохраняется некая произвольная дата, совсем не похожая на ту, которая должна была быть сохранена. | |
|
|
|
|
|
|
|
для: Minstel
(07.01.2011 в 15:13)
| | В какой кодирорвке текст php-скрипта?
Оператор SET NAMES применяете?
приводите код соединения с БД.
приводите структуру таблицы.
приводите текст запроса к БД. | |
|
|
|
|
|
|
|
для: Trianon
(07.01.2011 в 15:21)
| |
mysql> SHOW VARIABLES LIKE '%char%';
+-------------------------------------------------+
| Variable_name | value |
+--------------------------------------------------+
character_set_client | cp1251 |
character_set_connection| cp1251 |
character_set_database | cp1251 |
character_set_filesystem | binary |
character_set_results | cp1251 |
character_set_server | cp1251 |
character_set_system | utf8 |
character_sets_dir | G:\MySQL\share\charsets
|
Оператор SET NAMES применяю:
mysql_query("SET NAMES 'cp1251';")
|
Также пробовал и вот так:
mysql_set_charset('cp1251')
|
В php-скриптах пытаюсь явно указывать кодировку передаваемых данных:
header("Content-type: text/html, charset=windows-1251")
|
Соединение с базой данных:
$dbUsers = @mysql_connect($host, $user, $pass);
$ask = mysql_select_db($db);
$ask = mysql_set_charset('cp1251');
|
Запрос на создание таблицы:
$ask=mysql_query("CREATE TABLE IF NOT EXISTS $tableNews (
id_news INT NOT NULL AUTO_INCREMENT,
name TINYTEXT NOT NULL,
body TEXT NOT NULL,
putdate TINYTEXT NOT NULL,
url TINYTEXT,
urltext TINYTEXT,
urlpict TINYTEXT,
hide ENUM ('show', 'hide') NOT NULL DEFAULT 'show',
PRIMARY KEY (id_news));");
|
Запрос на запись к таблице:
$ask=mysql_query("INSERT INTO $tableNews (name, body, putdate, url, urltext)
VALUES (
'".mysql_escape_string($_REQUEST['name'])."',
'".mysql_escape_string($_REQUEST['body'])."',".
'{$form->fields['date']->GetStringDate()}',
"'{$form->fields['date']->GetStringDate()}',".
'".mysql_escape_string($_REQUEST['url'])."',
'".mysql_escape_string($_REQUEST['urlText'])."');");
|
Для написания скриптов использую Notepad2. Раньше не обращал внимание на кодировку самого файла скрипта. Сейчас проверил ее, изменил с той, что была (не помню, какая) на 1251.
Все равно проблема остается. | |
|
|
|
|
|
|
|
для: Minstel
(07.01.2011 в 21:59)
| | всё очень хорошо привели, кроме одного.
вот это
$ask=mysql_query("INSERT INTO $tableNews (name, body, putdate, url, urltext)
VALUES (
'".mysql_escape_string($_REQUEST['name'])."',
'".mysql_escape_string($_REQUEST['body'])."',".
'{$form->fields['date']->GetStringDate()}',
"'{$form->fields['date']->GetStringDate()}',".
'".mysql_escape_string($_REQUEST['url'])."',
'".mysql_escape_string($_REQUEST['urlText'])."');");
|
- это не запрос.
Это код на php, который этот запрос готовит и испускает.
А запрос будет если
$sql = "INSERT INTO $tableNews (name, body, putdate, url, urltext)
VALUES (
'".mysql_escape_string($_REQUEST['name'])."',
'".mysql_escape_string($_REQUEST['body'])."',".
'{$form->fields['date']->GetStringDate()}',
"'{$form->fields['date']->GetStringDate()}',".
'".mysql_escape_string($_REQUEST['url'])."',
'".mysql_escape_string($_REQUEST['urlText'])."');";
echo $sql;
|
| |
|
|
|
|
|
|
|
для: Trianon
(07.01.2011 в 22:57)
| | Если я правильно вас понял, нужно посмотреть, каков результат вывода строки такого запроса в браузер? Если да, то если произвести этот вывод, русские буквы сохраняются, никаких неизвестных символов не появляется. Зато обнаружилось, что неправильно выводится время. Стало быть, ошибка с датой находится в коде самого скрипта, и к базе данных отношения не имеет.
Ошибку эту нашел и исправил. Большое спасибо.)
Осталась проблема с русскими символами. | |
|
|
|
|
|
|
|
для: Minstel
(08.01.2011 в 11:07)
| | Если в запросе на создание таблицы Вы не указали кодировку, кодировка таблицы была унаследована из кодировки базы данных. И могла оказаться неверной.
Кодировка БД сама по себе тоже могла быть установлена запросом создания (изменения свойств) БД, а могла быть унаследована из кодировки сервера на момент создания.
Кстати запрос SHOW VARIABLES LIKE '%char%' имеет смысл издать из скрипта. Уж коль скоро Вам не нравится ситуация со скриптовым подключением (а не с консольным).
Ну и действительно SHOW CREATE TABLE tbl; и SHOW CREATE DATABASE db; могут прояснить ситуацию. | |
|
|
|
|
|
|
|
для: Trianon
(08.01.2011 в 11:42)
| | ->Кстати запрос SHOW VARIABLES LIKE '%char%' имеет смысл издать из скрипта. Уж коль
->скоро Вам не нравится ситуация со скриптовым подключением (а не с консольным).
А одни и те же переменные из под скрипта и в консоли могут принимать разные значения, в каком случае? | |
|
|
|
|
|
|
|
для: lightning.say
(08.01.2011 в 12:03)
| | Запрос SHOW VARIABLES выдает сессионные значения.
Сессии-то явно разные, так что настройки соединения у них могут (и по большому счету должны) быть выполнены по-разному - Windows-консоль по умолчанию работает в 866 кодовой странице.
сессией (в данном контексте) я называю сеанс подключения клиента БД к серверу БД | |
|
|
|
|
|
|
|
для: Minstel
(07.01.2011 в 21:59)
| | MYSQL команда
SHOW CREATE TABLE ИМЯ_ВАШЕЙ_ТАБИЦЫ;
в DEFAULT CHARSET что пишет? | |
|
|
|
|
|
|
|
для: lightning.say
(08.01.2011 в 02:01)
| |
mysql>SHOW CREATE DATABASE users;
...... CREATE DATABASE 'users' /*!40100 DEFAULT CHARACTER SET cp1251
|
mysql>SHOW CREATE TABLE systemNews;
...... DEFAULT CHARSET=cp 1251
|
| |
|
|
|
|
|
|
|
для: Minstel
(08.01.2011 в 13:37)
| | Вот Вы написали
Русские символы записываются в базу данных в виде абракадабры,
Откуда был сделан такое вывод, если обратно все выводится без проблем?
Где Вы усмотрели абракадабру? | |
|
|
|
|
|
|
|
для: Trianon
(08.01.2011 в 14:08)
| | А-а... Кажется, понял.) Дело в том, что я проверяю качество записи через коноль MySQL... Записываю из скрипта, а потом смотрю в консоль. Но если она работает в какой-то своей кодировке, так, наверное, и должно быть - она не будет правильно воспринимать некоторую информацию, записанную из скрипта. Хотя все и записано правильно.
Все действительно может быть так? Если да, тогда вопрос снимается.)) | |
|
|
|
|
|
|
|
для: Minstel
(08.01.2011 в 14:30)
| | в консолmyjv клиенте (для просмотра), устанавливая соединение, нужно исполнять запрос SET NAMES 'cp866'; | |
|
|
|
|
|
|
|
для: Trianon
(08.01.2011 в 14:32)
| | Все, понятно.) Большое спасибо за помощь.) | |
|
|
|
|
|
|
|
для: Minstel
(07.01.2011 в 15:13)
| | кодировка сайта (приложения, charset of content-type text/html) , клиентского соединения (то есть кодировки, в которой принимается запрос character_set_connection, кодировки, в которой выдается результат character_set_results ) и кодировки самих полей в таблицах.
Вот это должно совпадать обязательно.
P.S. автор: Trianon | |
|
|
|