Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: При добавлении записи в MySQL добавляются вопросительные знаки вместо букв.
 
 автор: tAleks   (17.05.2006 в 14:57)   письмо автору
 
 

PHP скрипт добавляет запись (русскими буквами) в базу днанных MySQL. А извлекает ??????????. Зашел в базу через phpMyAdmin там такая же фигня.
В чем это касяк, и как это исправить?

   
 
 автор: NickCo   (17.05.2006 в 15:00)   письмо автору
 
   для: tAleks   (17.05.2006 в 14:57)
 

Проверьте, совпадают ли кодировки таблицы и кодировка страницы, с которой выполняется добавление данных в базу.

   
 
 автор: tAleks   (17.05.2006 в 15:07)   письмо автору
 
   для: NickCo   (17.05.2006 в 15:00)
 

Как это проверить?

Смотрю через phpMyAdmin.
Для поля, в котором появляются вопросы всемто букв, стоит кодировка cp1251_general_ci, на сколько я понимаю, это русская Виндовская кодирока.

Страницы PHP, с которых добавляю запись в базу тоже сохраняю в 1251-кодироке.

   
 
 автор: NickCo   (17.05.2006 в 15:34)   письмо автору
 
   для: tAleks   (17.05.2006 в 15:07)
 

Попробуйте поменять кодировку таблицы на binary или varbinary

   
 
 автор: tAleks   (17.05.2006 в 17:16)   письмо автору
 
   для: NickCo   (17.05.2006 в 15:34)
 

Все равно такая же неприятность.

К стати, что это за типы такие Binfry и Varbinary? В phpMyAdmin я их вижу, но вот описания этих типов не нашел ни в Самоучителе MySQL 5 ни в Справочнике по MySQL.

   
 
 автор: NickCo   (17.05.2006 в 17:25)   письмо автору
 
   для: tAleks   (17.05.2006 в 17:16)
 

Varbinary - то же что binary, только для полей Varchar, а Binfry, если не ошибаюсь, что-то связанное с бинарными данными.

   
 
 автор: tAleks   (17.05.2006 в 17:38)   письмо автору
 
   для: NickCo   (17.05.2006 в 17:25)
 

Понятно...
А с вопросительными знаками-то что делать?

   
 
 автор: PantiL   (17.05.2006 в 20:08)   письмо автору
 
   для: tAleks   (17.05.2006 в 17:38)
 


mysql_query("SET NAMES cp1251");

   
 
 автор: cheops   (17.05.2006 в 23:38)   письмо автору
 
   для: tAleks   (17.05.2006 в 14:57)
 

У вас вероятно база данных MySQL версии выше 4.1. Для работы с русским текстом, необходимо настроить кодировку соединения, выполнив запрос
SET NAMES 'cp1251'

Вместо cp1251 следует выбрать кодировку, в которой вы передаёте текст.

   
 
 автор: tAleks   (18.05.2006 в 18:09)   письмо автору
 
   для: cheops   (17.05.2006 в 23:38)
 

Сейчас у меня стоит MySQL 5.

Где делать этот запрос? Каждый раз из PHP скрипта перед добавлением записи, или это нужно сделать из phpMyAdmin один раз?

И что этот запрос делает? Говорит базе данных принимать все данные в указанной кодировке, или кодирует отправляемые данные в указанную кодировку?

   
 
 автор: cheops   (18.05.2006 в 22:59)   письмо автору
 
   для: 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($ver0);
  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");
  
// Весь остальной код
?>

   
 
 автор: tAleks   (19.05.2006 в 07:15)   письмо автору
 
   для: cheops   (18.05.2006 в 22:59)
 

Спасибо! Ура! Заработало!

И еще один вопрос.

При посещении такой страницы, иностранными гразданами, у которых стоит англоязычная ОС, и какие-нибудь другие кодировки. Даные будут корректно преобразованы в указанную кодировку и перданы в базу данных?

Другими словами, гарантирует ли данный код то, что все данные которые будут переданы через эту форму в базу, будут кооректно сохраняться в указанной кодировке?

   
 
 автор: cheops   (19.05.2006 в 11:38)   письмо автору
 
   для: tAleks   (19.05.2006 в 07:15)
 

Если текст в SQL-запрос будет попадать в кодировке cp1251, то да, но ведь граждане могут набрать его и в другой кодировке - за этим нужно следить на HTML-странице, т.е. прописывать META-тэги и т.д.

   
 
 автор: tAleks   (20.05.2006 в 12:22)   письмо автору
 
   для: cheops   (19.05.2006 в 11:38)
 

Как я понимаю, мета-тег нужен такой:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

Правильно?

А что подразумевается под "и т.д."? Какие еще есть нюансы за которыми нужно следить?

   
 
 автор: cheops   (20.05.2006 в 17:34)   письмо автору
 
   для: tAleks   (20.05.2006 в 12:22)
 

Да собственно наверное больше никаких нет... просто помещайте корректный META-тэг и всё.

   
 
 автор: AlejandroS   (29.05.2006 в 07:50)   письмо автору
 
   для: 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. Если меняю кодировку, редактируя файл в ручную, то после перезагрузки консоль не открывается (только коротко мигает, и пищит как при ошибке). В чём дело - не знаю Подскажите, пожалуйста.
Спасибо большое.

   
 
 автор: cheops   (29.05.2006 в 12:10)   письмо автору
 
   для: 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
cd C:\mysql\bin

А отуда уже запускайте утилиту mysql
mysql -u имя_клиента

Перед этим в консоли следует установить кодировку cp1251
chcp 1251

так как по умолчанию используется кодировка DOS - 866. Затем как появляется приглашение mysql> выполняйте запрос
SET NAMES 'cp1251'


3) Дистрибутив используете полноценный или essential?

   
 
 автор: AlejandroS   (29.05.2006 в 12:56)   письмо автору
 
   для: 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". Полагаю, что полноценный.
Спасибо за Ваш ответ.
С уважением.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования