не смог решить проблему кодировок при переходе на mysql4.1.16

kostil

Новичок
не смог решить проблему кодировок при переходе на mysql4.1.16

привет всем
есть проблема с кодировками в mysql 4.1.16, я знаю что эта проблема уже не однакратно обсуждалась, и есть FAQ по этому поводу, но, к сожалению я перепробовал уже все что описано в посте и FAQ и желаемого резултата добиться так и не смог:(
быть может кто то подскажет что я делаю не так.
начну с самого начала.
обновил я совй rh9 до fedora 4 mysql4.1.16 php5.0.4 httpd2.0.54 все устанавливалось из rpm пакетов, посему все кодировки стоят по умолчанию latin1 базу из mysql3.23, которая хранилась в кодировке koi8r, сохранил без задней мысли простым mysqldump а потом залил ее в mysql4.1.16

PHP:
mysqldump -u admin -p video > video.sql
mysql -u admin -p video < video.sql
после чего сайт заработал, все русские буквы отображались корректно без каких либо дополнительных манипуляций но вот поиск и сортировка работать отказались
попробовал прописать в my.cnf default-character-set=koi8r но все осталось так же
вставил в скрипт подключения к базе строку mysql_qluery("set names koi8r") - тоже ничего
сам я обычно пользуюсь програмкой navicat для работы с базой. установил в ней чарсет соединения на koi8r и все русские буквы отображались нормально, но сортировка по прежнему не работала:(
из текста faq понял что у меня второй вариант проблемы. установил себе phpMyAdmin, в его конфигурации поставил чарсет koi8r однако вместо букв в моей базе он отображал кроказябли. Вот кодировки которые мне показывает phpMyAdmin в закладке variables

PHP:
character set client		utf8	
(Global value)			koi8r	
character set connection 	koi8r	
character set database 		koi8r	
character set results		utf8	
(Global value)			koi8r	
character set server		koi8r	
character set system		utf8	
character sets dir		/usr/share/mysql/charsets/	
collation connection		koi8r_general_ci	
collation database		koi8r_general_ci	
collation server		koi8r_general_ci
А на главной странице

PHP:
MySQL charset: UTF-8 Unicode (utf8) 
MySQL connection collation: koi8r_general_ci
после этого пробовал в phpMyAdmin делать set names koi8r что так же не дало эффекта, попрежнему отображались только карявки. запрос вида SELECT CONVERT(CONVERT(поле USING binary) USING кодировка) FROM таблица был опробован с кодировками koi8r utf8 и latin1 но вывести читабельный текст так и не удалось. непомню где прочитал, что можно сделать dump с заданной кодировкой, а не с кодировкой по умолчанию, тобиш utf8 стал пробовать разные варианты, при этом локаль в консоле стоит ru_RU.KOI8-R. вот что можно было увидеть в файлах дампа на месте русского текста(в роли просмоторщика был mc тоже с кодировкой koi8-r);

PHP:
[admin@test mybackup]# mysqldump -u root -p --default-character-set=utf8 video > video.utf8	карявки с буквой ц
[admin@test mybackup]# mysqldump -u root -p --default-character-set=latin1 video > video.latin1	Русский текст
[admin@test mybackup]# mysqldump -u root -p --default-character-set=koi8r video > video.koi8r	Вопросики
сделал скрипток для проверки кодировки через php:

PHP:
<?
        $link = mysql_connect('localhost','admin','mypass');
        mysql_select_db('video');
        if (!$link){
                printf("Connection failed: %s\n", mysql_error());
                exit();
        }
#	mysql_qluery("set names koi8r");
        $charset = mysql_client_encoding($link);
        printf("Current character set is %s<br><b>",$charset);
        mysql_close($link);
?>
который при всех моих манипуляциях упорно выводил latin1 даже когда раскоминтировал строку с set names...

посоветуйте что можно попробовать сделать?
ковыряюсь уже две недели, но ничего путного так и не вышло:(
 

440hz

php.ru
покажи дамп таблицы без данных (CREATE) в которой проблемы? т.е. кодировка есть не только на базу, подключение и т.д., но и на таблицу и поле. может там что-нить осталось ?

очень похоже у тебя там где-то latin1 присутствует или на тадлицу или на поле

у меня вот так все:
Код:
dev(root):/home/440hz#>mysqladmin -p var | grep utf
Enter password:
| character_set_client            | utf8                                                       |
| character_set_connection        | utf8                                                       |
| character_set_database          | utf8                                                       |
| character_set_results           | utf8                                                       |
| character_set_server            | utf8                                                       |
| character_set_system            | utf8                                                       |
| collation_connection            | utf8_general_ci                                            |
| collation_database              | utf8_general_ci                                            |
| collation_server                | utf8_general_ci                                            |
dev(root):/home/440hz#>cat /var/db/mysql/my.cnf | grep utf
character_set_client = utf8
character-set-server  =  utf8
default-character-set =  utf8
default-collation     =  utf8_general_ci
collation-server      =  utf8_general_ci

я бы сделал так:

1. сделал дамп, в котором нормально показывается (latin1).
2. руками убрал из CREATE все кодировки и т.д. что б при создании подхватились дефолтовые значения базы.
3. залил дамп обратно
 

kostil

Новичок
вот дамп с latin1
PHP:
-- MySQL dump 10.9
--
-- Host: localhost    Database: video
-- ------------------------------------------------------
-- Server version	4.1.16

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES latin1 */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `classify`
--

DROP TABLE IF EXISTS `classify`;
CREATE TABLE `classify` (
  `gid` int(10) unsigned NOT NULL auto_increment,
  `gname` varchar(20) NOT NULL default '',
  `pay` int(11) default NULL,
  `def` varchar(10) default NULL,
  `info` varchar(250) default NULL,
  PRIMARY KEY  (`gid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Dumping data for table `classify`
--


/*!40000 ALTER TABLE `classify` DISABLE KEYS */;
LOCK TABLES `classify` WRITE;
INSERT INTO `classify` VALUES (1,'ordinary',100,'on','обычные пользователи'),(2,'vip',0,'','особая группа');
UNLOCK TABLES;
/*!40000 ALTER TABLE `classify` ENABLE KEYS */;

--
-- Table structure for table `country`
--

DROP TABLE IF EXISTS `country`;
CREATE TABLE `country` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(250) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Dumping data for table `country`
--


/*!40000 ALTER TABLE `country` DISABLE KEYS */;
LOCK TABLES `country` WRITE;
INSERT INTO `country` VALUES (1,'США'),(2,'Россия'),(3,'Франция'),(4,'Китай'),(5,'Англия'),(6,'Канада'),(7,'ЮАР');
UNLOCK TABLES;
/*!40000 ALTER TABLE `country` ENABLE KEYS */;

--
что именно тут нужно подправить?
пробовал исправить utf8 на koi8r не помогло:(

-~{}~ 13.04.06 13:01:

у кого нибудь есть еще предположения?
я уже не знаю что пробовать:(

-~{}~ 15.04.06 20:43:

добавил в файл конфигурации такие строки
character_set_client = koi8r
character-set-server = koi8r
default-character-set = koi8r
default-collation = koi8r_general_ci
collation-server = koi8r_general_ci
теперь когда подключаешься через консоль, phpMyAdmin или Navicat выводит вот что:
PHP:
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | koi8r                      |
| character_set_connection | koi8r                      |
| character_set_database   | koi8r                      |
| character_set_results    | koi8r                      |
| character_set_server     | koi8r                      |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set
 
mysql> show variables like 'col%';
+----------------------+------------------+
| Variable_name        | Value            |
+----------------------+------------------+
| collation_connection | koi8r_general_ci |
| collation_database   | koi8r_general_ci |
| collation_server     | koi8r_general_ci |
+----------------------+------------------+
3 rows in set
но когда я вробую test.php
PHP:
<? 
        $link = mysql_connect('localhost','admin','mypass'); 
        mysql_select_db('video'); 
        if (!$link){ 
                printf("Connection failed: %s\n", mysql_error()); 
                exit(); 
        } 
#    mysql_qluery("set names koi8r"); 
        $charset = mysql_client_encoding($link); 
        printf("Current character set is %s<br><b>",$charset); 
        mysql_close($link); 
?>
броузер выводит Current character set is latin1, даже если снять комментарий со строки mysql_query("set names koi8r");

еще теперь в браузере отображаются вопросики вместо слов из базы, не если после подключения к базе сделать запрос
mysql_query("set names latin1") то все слова отображаются нормально.

пробовал как советовал 440hz:
------
я бы сделал так:

1. сделал дамп, в котором нормально показывается (latin1).
2. руками убрал из CREATE все кодировки и т.д. что б при создании подхватились дефолтовые значения базы.
3. залил дамп обратно
------
в браузере отображаються одни вопросы, вставлял в скрипт подключения к базе запрос set names koi8r/latin1/utf8 все равно вопросы, меняется только один символ русская буква 'В'

koi8r / latin1 / utf8
&#247; / В / ц&#9573;

есть у кого нибудь какие то соображения?
 
Сверху