|
|
|
| PHP скрипт добавляет запись (русскими буквами) в базу днанных MySQL. А извлекает ??????????. Зашел в базу через phpMyAdmin там такая же фигня.
В чем это касяк, и как это исправить? | |
|
|
|
|
|
|
|
для: tAleks
(17.05.2006 в 14:57)
| | Проверьте, совпадают ли кодировки таблицы и кодировка страницы, с которой выполняется добавление данных в базу. | |
|
|
|
|
|
|
|
для: NickCo
(17.05.2006 в 15:00)
| | Как это проверить?
Смотрю через phpMyAdmin.
Для поля, в котором появляются вопросы всемто букв, стоит кодировка cp1251_general_ci, на сколько я понимаю, это русская Виндовская кодирока.
Страницы PHP, с которых добавляю запись в базу тоже сохраняю в 1251-кодироке. | |
|
|
|
|
|
|
|
для: tAleks
(17.05.2006 в 15:07)
| | Попробуйте поменять кодировку таблицы на binary или varbinary | |
|
|
|
|
|
|
|
для: NickCo
(17.05.2006 в 15:34)
| | Все равно такая же неприятность.
К стати, что это за типы такие Binfry и Varbinary? В phpMyAdmin я их вижу, но вот описания этих типов не нашел ни в Самоучителе MySQL 5 ни в Справочнике по MySQL. | |
|
|
|
|
|
|
|
для: tAleks
(17.05.2006 в 17:16)
| | Varbinary - то же что binary, только для полей Varchar, а Binfry, если не ошибаюсь, что-то связанное с бинарными данными. | |
|
|
|
|
|
|
|
для: NickCo
(17.05.2006 в 17:25)
| | Понятно...
А с вопросительными знаками-то что делать? | |
|
|
|
|
|
|
|
для: tAleks
(17.05.2006 в 17:38)
| |
mysql_query("SET NAMES cp1251");
|
| |
|
|
|
|
|
|
|
для: tAleks
(17.05.2006 в 14:57)
| | У вас вероятно база данных MySQL версии выше 4.1. Для работы с русским текстом, необходимо настроить кодировку соединения, выполнив запрос
Вместо cp1251 следует выбрать кодировку, в которой вы передаёте текст. | |
|
|
|
|
|
|
|
для: cheops
(17.05.2006 в 23:38)
| | Сейчас у меня стоит MySQL 5.
Где делать этот запрос? Каждый раз из PHP скрипта перед добавлением записи, или это нужно сделать из phpMyAdmin один раз?
И что этот запрос делает? Говорит базе данных принимать все данные в указанной кодировке, или кодирует отправляемые данные в указанную кодировку? | |
|
|
|
|
|
|
|
для: tAleks
(18.05.2006 в 18:09)
| | phpMyAdmin сам позаботится об кодировании данных, если выбрано сопоставление cp1251_general_ci, если вы работате из PHP-кода, то да каждый раз после выполнения функции mysql_connect(), потребуется устанавливать кодировку соединения. Данный запрос говорит о том, что всё что отличается от английского языка будет передаваться в кодировке cp1251. Для совместимости с MySQL > 4.1 и < 4.1 мы обычно используем следующий конфигурационный файл config.php
<?php
///////////////////////////////////////////////////
// 2006 (C) IT-студия SoftTime (http://www.softtime.ru)
///////////////////////////////////////////////////
// сейчас выставлен сервер локальной машины
$dblocation = "localhost";
// Имя базы данных, на хостинге или локальной машине
$dbname = "database";
// Имя пользователя базы данных
$dbuser = "root";
// и его пароль
$dbpasswd = "";
// Устанавливаем соединение с базой данных
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx) {
exit( "<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>" );
}
// Выбираем базу данных
if (! @mysql_select_db($dbname,$dbcnx) ) {
exit( "<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>" );
}
// Определяем версию сервера
$query = "SELECT VERSION()";
$ver = mysql_query($query);
if(!$ver) exit("Ошибка при определении версии MySQL-сервера");
$version = mysql_result($ver, 0);
list($major, $minor) = explode(".", $version);
// Если версия выше 4.1 сообщаем серверу, что будем работать с
// кодировкой cp1251
$ver = $major.".".$minor;
if((float)$ver >= 4.1)
{
mysql_query("SET NAMES 'cp1251'");
}
?>
|
А затем можно подключать данный файл при помощи конструкции require_once() всякий раз, когда потребуется обращение к базе данных MySQL в файле
<?php
// Устанавливаем соединение с СУБД MySQL
require_once("config.php");
// Весь остальной код
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(18.05.2006 в 22:59)
| | Спасибо! Ура! Заработало!
И еще один вопрос.
При посещении такой страницы, иностранными гразданами, у которых стоит англоязычная ОС, и какие-нибудь другие кодировки. Даные будут корректно преобразованы в указанную кодировку и перданы в базу данных?
Другими словами, гарантирует ли данный код то, что все данные которые будут переданы через эту форму в базу, будут кооректно сохраняться в указанной кодировке? | |
|
|
|
|
|
|
|
для: tAleks
(19.05.2006 в 07:15)
| | Если текст в SQL-запрос будет попадать в кодировке cp1251, то да, но ведь граждане могут набрать его и в другой кодировке - за этим нужно следить на HTML-странице, т.е. прописывать META-тэги и т.д. | |
|
|
|
|
|
|
|
для: cheops
(19.05.2006 в 11:38)
| | Как я понимаю, мета-тег нужен такой:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
Правильно?
А что подразумевается под "и т.д."? Какие еще есть нюансы за которыми нужно следить? | |
|
|
|
|
|
|
|
для: tAleks
(20.05.2006 в 12:22)
| | Да собственно наверное больше никаких нет... просто помещайте корректный META-тэг и всё. | |
|
|
|
|
|
|
|
для: cheops
(18.05.2006 в 22:59)
| | Уважаемый Cheops.
Хочу задать вопрос, связанный с темой. Но прежде хочу выразить Вам свою признательность и уважение за Ваши знания, которыми Вы делитесь с нами (не очень продвинутыми энтузиастами:-)).
Итак вопрос.
Вся эта кутерьма с вопросительными знаками пройдена и мною. Как говорится ОТ и ДО. Однако, вопрос состоит в том, что от вопросительных знаков в консоли MySQL мне избавиться так и не удалось. Хотя, при этом сделал всё мыслимое и немыслимое. Настроены и Apache 2, и PHP 5, и MySQL 4.1.8 на кодировку Windows-1251 (cp1251). В коде скриптов символы передаются корректно. В phpMyAdmin'е всё тоже читается корректно, успешно добавляется в таблицу базы, извлекается скриптом и помещается на html-странице корректно. Но когда захожу в консоль MySQL (Command Line Client), то по запросу "select * from mytable" выводятся эти самые вопросительные знаки. Хочу спросить Вас. 1. Какую настройку MySQL можно ещё "тронуть", чтобы данные по запросу в консоли отражались корректно?, и 2. Может ли это отразиться на дальнейшей работе с данными из таблиц базы (я имею в виду корректную сортировку и верное "понимание" базой запросов)?
Настройки мною произведены такие:
httpd.conf (Apache 2.0.58)
AddDefaultCharset windows-1251
AddCharset WINDOWS-1251 .cp-1251 .win-1251
php.ini (PHP 5.1.4)
default_charset = "Windows-1251"
mssql.charset = "Windows-1251"
my.ini (PHP 4.1.8)
default-character-set=latin1
Здесь хочу пояснить. Пытаюсь заменить latin1 на cp1251 двумя способами. Если с помощью Server Instance Config Wizard'а, то по окончании изменений, когда захожу в файл my.ini вижу эту же строку со значением не cp1251, а latin1. Если меняю кодировку, редактируя файл в ручную, то после перезагрузки консоль не открывается (только коротко мигает, и пищит как при ошибке). В чём дело - не знаю Подскажите, пожалуйста.
Спасибо большое. | |
|
|
|
|
|
|
|
для: AlejandroS
(29.05.2006 в 07:50)
| | 1) А пути в my.ini
basedir="C:/mysql/"
#Path to the database root
datadir="C:/mysql/Data/"
|
указаны корректно? Где лежит my.ini?
2) Вы зря используете Command Line Client - это не удобная утилита, луше запускайте командную строку и переходите в директорию C:/mysql/bin
А отуда уже запускайте утилиту mysql
Перед этим в консоли следует установить кодировку cp1251
так как по умолчанию используется кодировка DOS - 866. Затем как появляется приглашение mysql> выполняйте запрос
3) Дистрибутив используете полноценный или essential? | |
|
|
|
|
|
|
|
для: cheops
(29.05.2006 в 12:10)
| | 1. MySQL установлена в директорию D:\MySQL4_1\,
В my.ini код такой:
basedir=D:/MySQL4_1/
datadir=D:/MySQL4_1/Data/
my.ini расположен в корневой директории D:/MySQL4_1/.
2. В принципе, всё работает нормально и корректно, но попробую "сходить" в базу из командной строки.
3. Дистрибутив mysql-4.1.8-win взял с диска-приложения к книге "Самоучитель MySQL 5". Полагаю, что полноценный.
Спасибо за Ваш ответ.
С уважением. | |
|
|
|