Gentoo Linux и MySQL Server - не получается поставить кодировку cp1251

WebPHPDev

Новичок
Gentoo Linux и MySQL Server - не получается поставить кодировку cp1251

Cтавлю в konqueror кодировку: вид - вручную - кодировка - кирилица cp1251
Создаю таблицу через phpMyAdmin, указываю сравнение таблицы и текстовых полей: cp1251_general_ci.
Добавляю нововое значение в таблицу - русские символы заменяются на вопросительные знаки.
Локаль на Дженту: koi8r.

Вот мой конфиг MySQL /etc/mysql/my.cnf:
http://best-projects.net/files/my.cnf

И вот информация (server system variables) из phpMyAmdin:
http://best-projects.net/files/server_variables.html

Насколько я понял Global values - это значения, которые переопределены успешно. Как видите некоторые ЮТФы переопределены кодировкой 1251, но не все. Значение character set system по-прежнему осталось utf8.
Как его заменить?
Может ведь из-за него эти знаки вопросов??

Поведение браузера при кодировке "по умолчанию" (автоматическое распознавание). Добавляю новое значение с русским текстом сохраняет в абракадабре. Но! 1. Сохраняет! (-: 2. Абракадабра, это не знаки вопросов. По-моему это как раз кодировка ЮТФ.

Кто-нибудь сталкивался с чем-то подобным?

Конфигурационные данные:
OS: Gentoo Linux 2006.1
MySQL: MySQL Server 5.0.38
Локаль ОС: koi8-r.
 

ioleg

Новичок
1. А на главной странице phpMyAdmin "Сопоставление соединения с MySQL:" что стоит?
2. Под главным пользователем заходишь?
3. Ты хочешь полностью это решить или сойдет просто приспособиться к этому?
 

WebPHPDev

Новичок
1. MySQL connection collation utf8_general_ci
MySQL charset: UTF-8 Unicode (utf8)
2. Да
3. Полностью. Сложнова-то приспособиться к нечитаемой кодировке :)
Хотя ты возможно имел ввиду переход на UTF-8 кодировку. Но пока не подумываю об этом. Для совместимости с моим сервером хочу остановиться пока что на cp1251, а там виднее будет.
 

ioleg

Новичок
1. А если поставить cp1251_general_ci что выдает?
2. Создай другого пользователя и зайди под ним. Бывали такие проблемки когда под основным заходили.
3. Если перейдешь на UTF-8, будет на много проще. Ну, если не хочешь долго играться, то используй mysql_query('set names cp1251') после соединения с сервером БД.
4. А если не использовать phpMyAdmin, а на прямую с сервером работать как он результат выдает?
 

WebPHPDev

Новичок
1. Оно не даёт устанавливать новые значения. При попытке установки - релодит страницу и выдаёт то же самое значение.
2. Неа, не помогло.
3. Проще.. возможно. Но и данные разрастуться.. А сильно ли в среднем?
4. Использую для теста простенький РНР сценарий:
Код:
<?php
header ( "Content-Type:text/html;charset=windows-1251" );

$link = mysql_connect ( "localhost", "root", "" ) or die ( mysql_error () );
mysql_select_db ( "test" );

//!!! mysql_query ( "set names 'cp1251'" );
mysql_query ( "insert into `my` values ('тест')" );

$result = mysql_query ( "select * from `my`" ) or die ( mysql_error () );
while ( $row = mysql_fetch_assoc ( $result ) ) {
	echo $row['p_name'] . '<br>';
}
mysql_close ( $link );

?>
Результаты тестов у меня такие:

1. Если "set names 'cp1251'" не выполнять - то добавляется значение вопросами (как в браузере так и в консоли (/usr/bin/mysql)).

2. Если "set names 'cp1251'" выполнять и файл находится в кодировке cp1251 (и соответственно слово "тест" также в ней) - то в браузер выводится: "тест", а в консоле: "РЕЯР". Т.е. оно же, но в кои8-р.
Такое впечатление, что добавление происходит корректно, но при выводе на консоль оно это cp1251 кодирует дополнительно в koi8r. Ну правильно наверное, системная консоль-то у меня в koi8-r.

3. Если "set names 'cp1251'" НЕ ВЫПОЛНЯТЬ, не добавлять нового значения. Просто вывести на экран. То все предыдущие "тест"ы, которые отписывались корректно заменяться такими: "тест".
А это уже похоже на ЮТФ8. Т.е. сэт-нэймс использовать нужно. Но это ведь дополнительная перекодировка, дополнительные затраты ресурса?

-~{}~ 30.04.07 05:08:

Провёл независимое исследование по разбуханию данных в кодировках. :)
Сравнивал cp1251 и utf8.
cp1251.txt = 4166 b
utf8 = 7610 b

Неслабенько так разбух. 46% как никак. На половину почти. Весомо.
 

zerkms

TDD infected
Команда форума
Провёл независимое исследование по разбуханию данных в кодировках.
Сравнивал cp1251 и utf8.
cp1251.txt = 4166 b
utf8 = 7610 b

Неслабенько так разбух. 46% как никак. На половину почти. Весомо.
можно было догадаться что 2 байта занимают в 2 раза больше места чем 1
 

Активист

Активист
Команда форума
Недавно обновился до Debian Lenny, стояли пакеты

root@d286:~# dpkg -l | grep mysql
ii libdbd-mysql-perl 4.004-1 A Perl5 database interface to the MySQL data
ii libmysqlclient15off 5.0.38-1 mysql database client library
ii mysql-client-5.0 5.0.38-1 mysql database client binaries
ii mysql-common 5.0.38-1 mysql database common files (e.g. /etc/mysql
ii mysql-server 5.0.38-1 mysql database server (meta package dependin
ii mysql-server-5.0 5.0.38-1 mysql database server binaries
ii php5-mysql 5.2.0-10 MySQL module for php5

В результате, никаких изменений в кодировке при подаче запросов типа
root@d286:~# cat /etc/mysql/my.cnf | grep cp1251
init-connect="SET CHARACTER SET 'cp1251'"
init-connect="SET NAMES 'cp1251'"
root@d286:~#

Или же явно в коде
$this->query("SET NAMES cp1251");
$this->query("SET CHARACTER SET cp1251");
$this->query("SET @@collation_connection = cp1251_general_ci");
Не наблюдал

mysql_client_uncoding();
Возвращала latin1

mysql_real_escape_string()
использовал latin1

В базе все в "вопросиках"

Выходом стало только создание таблиц с явным указанием кодировки и сопоставления

$this->sql->query("
CREATE TABLE `#__#sCatalogGroups`(
`groupId` INT UNSIGNED NOT NU
LL,
`ownerId` INT UNSIGNED NOT NU
LL,
`groupTitle` TINYTEXT
)
DEFAULT CHARACTER SET 'cp1251'
DEFAULT COLLATE cp1251_general_ci
");
 

zerkms

TDD infected
Команда форума
Активист
кодировка таблицы указывает - в какой кодировке хранятся данные в таблице
set names указывает - в какой кодировке клиент общается с сервером

Выходом стало только создание таблиц с явным указанием кодировки и сопоставления
так что это не "выход", а вполне логичное решение, которое осознаёшь после прочтения http://phpclub.ru/faq/Mysql41Rus
 

Активист

Активист
Команда форума
Ну хорошо,

>set names указывает - в какой кодировке клиент общается с
> сервером

mysql_query("SET NAMES cp1251", $this->connectionId);
mysql_client_encoding($this->connectionId);

Возвращает latin1 ?
 

zerkms

TDD infected
Команда форума
PHP:
$c = mysql_connect('localhost');
mysql_select_db('test');

echo 'Before:<br />';

$res = mysql_query("SHOW VARIABLES LIKE '%char%'");
while ($row = mysql_fetch_array($res)) {
    echo $row[0] . ' = ' . $row[1] . '<br />';
}

echo 'After:<br />';

mysql_query('SET NAMES cp1251');
$res = mysql_query("SHOW VARIABLES LIKE '%char%'");
while ($row = mysql_fetch_array($res)) {
    echo $row[0] . ' = ' . $row[1] . '<br />';
}
Код:
Before:
character_set_client = latin1
character_set_connection = latin1
character_set_database = cp1251
character_set_results = latin1
character_set_server = latin1
character_set_system = utf8
character_sets_dir = S:\usr\local\mysql\share\charsets/
After:
character_set_client = cp1251
character_set_connection = cp1251
character_set_database = cp1251
character_set_results = cp1251
character_set_server = latin1
character_set_system = utf8
character_sets_dir = S:\usr\local\mysql\share\charsets/
 

Активист

Активист
Команда форума
И что? Мой пост почитай. И с чего он начинается, спорить не буду, но и тебе не советую.
 

zerkms

TDD infected
Команда форума
Активист
вот только угрожать не надо да ;)

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

WebPHPDev

Новичок
Локализую систему в cp1251. Что с этого уже получил. В консоли при прямом обращении выдаёт действительно русские символы. (если вставлены они были с выполненным "set names 'cp1251'". Без него - знаки вопросов.)

Теперь. Чтобы получить данные в корректном отображении нужно изначально первым запросом ставить set names, что крайне неудобно. Это же мне надо по всем скриптам теперь пробежать, разобраться где там и как осуществляются запросы к mysql.... короче гемор :)

Вот "show variables" моего сервера mysql:
http://best-projects.net/files/mysql-show-variables.txt

Как и где переопределить переменную "character_set_system"?
Пытался в /etc/mysql/my.conf - либо пытался неправильно, либо это переопределяется не там, не получилось.
Мне кажется именно в этой переменной всё дело. По крайней мере, одна она упоминает utf8.

-~{}~ 30.04.07 15:22:

Примечательно то, что добавить с консоли можно русский текст, который отобразится успешно. При этом не используя set names!

Код:
mysql> use test;
mysql> insert into my values ('привет!');
Query OK, 1 row affected (0.00 sec)

mysql> select * from my;
+---------+
| p_name  |
+---------+
| привет! |
+---------+
1 rows in set (0.00 sec)

mysql>
Интересно, а почему же скрипты общаются неизвестно на какой кодировке? (на ютфе подозреваю).

PS юниксовая локаль в cp1251 это убийство просто :)

-~{}~ 30.04.07 21:49:

Никто не знает где переопределяется эта "character_set_system" ??

-~{}~ 01.05.07 00:25:

Скажите, а использование set names это ведь дополнительная затрата ресурсов сервера на принудительную перекодировку? Или нет?

-~{}~ 01.05.07 04:54:

Так и не смог заставить MySQL работать по дефолту с 1251. В качестве выхода добавил в /etc/mysql/my.cnf:
Код:
[server]
init-connect="SET NAMES cp1251"
Решение насколько понимаю фиговое. Поскольку принуждает MySQL после каждого запроса кодировать его дополнительно в 1251, что увеличивает нагрузки на сервер. Что на реальном сервере недопустимо.
Если я правильно понимаю... Надеюсь понимаю неправильно.
 

zerkms

TDD infected
Команда форума
Поскольку принуждает MySQL после каждого запроса кодировать его дополнительно в 1251, что увеличивает нагрузки на сервер. Что на реальном сервере недопустимо.
Если я правильно понимаю
понимаешь правильно
ответ будет кодироваться из исходной кодировки в которой хранится в cp1251
данные из запроса на модификацию наоборот - из cp1251 в ту, в которой они будут храниться в таблице
это нормальная практика, никто от этого не умер
 

WebPHPDev

Новичок
Но это же и лишняя нагрузка на MySQL. Особенно при большом числе запросов от нескольких сайтов.
Как выход пусть пока работает, а так буду пытаться найти более оптимальное решение.
 

zerkms

TDD infected
Команда форума
WebPHPDev
переходи на файлы или пиши свою субд ;)
 

WebPHPDev

Новичок
Не ну такие решения я вообще не рассматриваю :) ... так что Вы там про сэт нэймс говорили?... :)

А в виндовом MySQL разве также используется такое принудительное декодирование? по-моему там по умолчанию можно выставить 1251, чтобы по умолчанию сервер как принимал данные в этой кодировке (здесь проблем и в линуксе нет), но и чтобы и выборку возвращал именно в этой кодировке, а не изначально в ЮТФе, а затем в 1251..
 
Сверху