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

Форум MySQL

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

 

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

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

тема: кодировка MySQL
 
 автор: Jackson   (22.02.2012 в 00:36)   письмо автору
 
 

Здравствуйте!
Не получается добиться нормального отображения информации, записанной в бд.
На странице, в META теге установлено charset=windows-1251, базу данных (и все таблицы с столбцами) привожу к кодировке cp1250_general_ci.
Есть форма регистрации, из которой ФИО записывается в соответствующие таблицы. При авторизации на странице нечитаемые символы, вместо ФИО.
Как привести все к одной кодировке? В чем я не прав?
Тут собственно проблемная страница.

  Ответить  
 
 автор: cheops   (22.02.2012 в 00:58)   письмо автору
 
   для: Jackson   (22.02.2012 в 00:36)
 

>привожу к кодировке cp1250_general_ci.
1. Как это делаете (опишите подробнее)?
2. Почему 1250, а не 1251? Или это опечатка?

  Ответить  
 
 автор: Jackson   (22.02.2012 в 01:21)   письмо автору
 
   для: cheops   (22.02.2012 в 00:58)
 

действительно опечатался - 1251. Менял в phpMyAdmin, вот такие запросы:
ALTER DATABASE `user_auth` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;
ALTER TABLE `user_auth` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;
ALTER TABLE `user_info` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;
ALTER TABLE `user_auth` CHANGE `pass` `pass` VARCHAR( 32 ) CHARACTER SET cp1251 COLLATE cp1251_general_ci NOT NULL;
ALTER TABLE `user_info` CHANGE `first_name` `first_name` VARCHAR( 20 ) CHARACTER SET cp1251 COLLATE cp1251_general_ci NOT NULL ;

  Ответить  
 
 автор: Valick   (22.02.2012 в 07:29)   письмо автору
 
   для: Jackson   (22.02.2012 в 01:21)
 

при соединении с базой данных указываете кодировку?

  Ответить  
 
 автор: Jackson   (22.02.2012 в 11:20)   письмо автору
 
   для: Valick   (22.02.2012 в 07:29)
 

выполнил несколько запросрв сразу же после mysql_select_db:
Mysql_query("set character_set_client='cp1251'");
Mysql_query("set character_set_results='cp1251'");
Mysql_query("set collation_connection='cp1251'");

При отображении информации из бд запросил текущую кодировку mysql_client_encoding() поразился - latin1

  Ответить  
 
 автор: Jackson   (22.02.2012 в 23:29)   письмо автору
 
   для: Jackson   (22.02.2012 в 11:20)
 

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

show create database `test`;
show create table `user_info`;


на выходе:


test    CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET cp1251 */

user_info    CREATE TABLE `user_info` (
 `user_id` int(6) NOT NULL,
 `first_name` varchar(20) NOT NULL,
 `middle_name` varchar(20) NOT NULL,
 `last_name` varchar(20) NOT NULL,
 `email` varchar(20) NOT NULL,
 `image` varchar(32) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=cp1251


смотрю кодировки:
show variables like "char%"


character_set_client    utf8
character_set_connection    utf8
character_set_database    cp1251
character_set_filesystem    binary
character_set_results    utf8
character_set_server                 utf8
character_set_system    utf8

нигде и в помине нет latin1....

потом пытаюсь в phpMyAdmin выполнить запрос

set names 'cp1251';
show variables like "char%";


в таком случае кодировки соединения, результата, клиента устанавливаются в cp1251, но как я понял, только на время соединения, т.к. при следующем запросе show variables устанавливается кодировка в utf8.

Но откуда же взялась latin1?

  Ответить  
 
 автор: Jackson   (22.02.2012 в 23:41)   письмо автору
 
   для: Jackson   (22.02.2012 в 23:29)
 

Приведу фрагмент кода, может в нем гвоздь

class ps_DB {

  private $lid = 0;                 // Ccылка на идентификатор соединения
  private $qid = 0;            // Ссылка на идентификатор запроса
  private $row;            // Текущая запись в запросе
  private $record = array();    // Текущая строка в запросе
  private $error = "";        
  private $errno = "";        

  // При создании объекта  устанавливаем соединение

  function __construct() {

    if ($this->lid == 0) {
      $this->lid = mysql_connect(DB_HOST,DB_USER,DB_PWD);
      if (!$this->lid) {
    $this->halt("connect(" . DB_HOST . ",USER,PASSWORD)  failed.");
      }

      if (!@mysql_select_db(DB_NAME,$this->lid)) {
    $this->halt("Cannot connect to database ".DB_NAME);
    return 0;
      }
    mysql_query("SET NAMES `cp1251`");
    }
    return $this->lid;
  }

  function __destruct() {
      mysql_close($this->lid);
  }
...
дальше методы для запроса и т.д.
...


.... $db = new ps_DB;....


Может где то тут ошибка? Возможно, думаю что установленно соединение, тогда как его нет?
Хотя далее по коду функция mysql_real_escape_string() выполняется без ошибок.

  Ответить  
 
 автор: cheops   (22.02.2012 в 10:08)   письмо автору
 
   для: Jackson   (22.02.2012 в 01:21)
 

Изменение кодировки в базах данных, таблицах и полях, не перекодирует ранее помещенную информацию - кодировка внутри таблиц остается старой.

  Ответить  
 
 автор: Jackson   (22.02.2012 в 11:22)   письмо автору
 
   для: cheops   (22.02.2012 в 10:08)
 

после каждого изменения регистрирую нового пользователя и смотрю на получившиеся результаты - пока не могу добиться нужного

  Ответить  
 
 автор: Jackson   (23.02.2012 в 22:20)   письмо автору
 
   для: Jackson   (22.02.2012 в 11:22)
 

вопрос снимается, не в мускуле дело - обрабатывал данные функцией htmlentities().

  Ответить  
Rambler's Top100
вверх

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