URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8994
[ Назад ]

Исходное сообщение
"MySQL Collation, Character Cp1251"

Отправлено kvasik , 15-Янв-11 02:29 
Доброй ночи.
Извечная проблема совместимоти кодировок Win и *Nix снова напомнила о себе :)
Есть сервачок с системой резервного бэкапа на Bacula. Настроено на FreeBSD 8.1 с адаптированной под винду консолью (кодировка Cp1251).
Консольный вариант Bacula отлично выполняет свои функции, в том числе и с опознованием русских имён/путей файлов.

Для удобства установил Webacula, а заодно и Bat. С этими примочками вышла аказия: на веб-интерфейсе, при отображении списка бекапных файлов, где должны быть кириллические имена -отображаются пустые строки, а в Bat вопросики.

Начал думать в сторону MySQL т.к. данные подтягиваются из БД.
Стоит отметить, что SELECT выдает корректные данные с названием папок на кириллице:
mysql> use bacula
mysql> select * from Path;
| 16 | /usr/home/user/Чтение PDF и DJVU/Электронная библиотека/

В нете нашел информацию, что корректное отображение в консоли не гарантирует качество конечного результата. Сделал запрос с указанием Collation:

mysql>  select * from Path order by Path collate cp1251_general_ci;
ERROR 1253 (42000): COLLATION 'cp1251_general_ci' is not valid for CHARACTER SET 'binary'

Однако, перед тем как делать такой запрос, подготовился:

БД была создана с такими параметрами:
CREATE DATABASE ${db_name} CHARACTER SET cp1251 COLLATE cp1251_general_ci;

Таблица с такими параметрами:
CREATE TABLE Path
   (
   PathId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
   Path BLOB NOT NULL,
   PRIMARY KEY(PathId),
   INDEX (Path(255))
   )
   CHARACTER SET cp1251 COLLATE cp1251_general_ci;
  
Да и параметры my.cnf тоже были изменены, результат этих изменений вот:
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | cp1251                           |
| character_set_connection | cp1251                           |
| character_set_database   | cp1251                           |
| character_set_filesystem | cp1251                           |
| character_set_results    | cp1251                           |
| character_set_server     | cp1251                           |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | cp1251_general_ci |
| collation_database   | cp1251_general_ci |
| collation_server     | cp1251_general_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

Откуда мог взяться в нашей таблице CHARACTER SET 'binary' не могу понять...



Содержание

Сообщения в этом обсуждении
"MySQL Collation, Character Cp1251"
Отправлено NuINu , 15-Янв-11 11:52 

>>Для удобства установил Webacula, а заодно и Bat. С этими примочками вышла аказия: на >>веб-интерфейсе, при отображении списка бекапных файлов, где должны быть кириллические >>имена -отображаются пустые строки, а в Bat вопросики.

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


"MySQL Collation, Character Cp1251"
Отправлено kvasik , 16-Янв-11 00:34 
>>проверьте поток тсп от веб сервера и посмотрите что там за символы, есть ли они, в какой они кодировке...

Что вы имеете ввиду под потоком тсп, как его посмотреть? Страница с веб-интерфейсом на русском языке, он корректно отображается. Фрагмент исходного кода странички, где зафиксированы пути расположения файлов выглядит так:

<tr>
<td>drwxr-xr-x</td><td>0  1003</td><td>20-Dec-10 10:51:00</td><td>512 bytes</td>
    <td></td> #-------> здесь должен находится путь, в котором присутствует CP1251, но тут пусто.
    <td>   56  </td>
</tr>
<tr>

<td>-rw-r--r--</td><td>1003  1003</td><td>23-Dec-10 12:23:00</td><td>1.8 MB</td>
    <td>/usr/home/user/soft/snpvw.exe</td> #-------> здесь CP1251 отсутствует и путь отображается.
    <td>   57  </td>
</tr>

такие пироги...


"MySQL Collation, Character Cp1251"
Отправлено NuINu , 16-Янв-11 15:35 

> <tr>
> <td>drwxr-xr-x</td><td>0  1003</td><td>20-Dec-10 10:51:00</td><td>512 bytes</td>
>  <td></td> #-------> здесь должен находится путь, в котором присутствует CP1251, но
> тут пусто.
> </tr>
> такие пироги...

тогда о каких вопросиках при использовании некоего Bat идет речь?


"MySQL Collation, Character Cp1251"
Отправлено pavlinux , 16-Янв-11 14:36 
> Откуда мог взяться в нашей таблице CHARACTER SET 'binary' не могу понять...

Path BLOB NOT NULL,


A BLOB is a binary large object that can hold a variable amount of data.
BLOB values are treated as binary strings (byte strings).

Может VARCHAR вместо Блоба?

Ну и второе, если системная локаль UTF8, то нафига создавать базы и таблицы в CP1251?
Пущай перекодировкой занимаются клиенты.


"MySQL Collation, Character Cp1251"
Отправлено kvasik , 17-Янв-11 11:35 
>> Откуда мог взяться в нашей таблице CHARACTER SET 'binary' не могу понять...
> Может VARCHAR вместо Блоба?
> Ну и второе, если системная локаль UTF8, то нафига создавать базы и
> таблицы в CP1251?
> Пущай перекодировкой занимаются клиенты.

Изменил на VARCHAR(500) ситуация изменилась, на веб-интерфейсе уже начали появляться разные символы :) Думаю, ещё поиграться с кодировками и все заработает как надо.
Системная локаль тоже на CP1251, т.к. приходится крутить виндовозные файлы.

2NuINu Bat(Bacula Administration Tool) отдельеное приложение, судя по всему, механизм взаимодействия работает несколько иначе, чем веб.



"MySQL Collation, Character Cp1251"
Отправлено pavlinux , 17-Янв-11 14:32 
> Системная локаль тоже на CP1251, т.к. ....

А выше:
> mysql> SHOW VARIABLES LIKE 'character_set%';
> ...
>| character_set_system     | utf8                             |
>


"MySQL Collation, Character Cp1251"
Отправлено kvasik , 17-Янв-11 15:35 
>> Системная локаль тоже на CP1251, т.к. ....
> А выше:
>> mysql> SHOW VARIABLES LIKE 'character_set%';
>> ...
>>| character_set_system     | utf8                             |
>>

Этот параметр, если не ошибаюсь, изменить вообще нельзя?
Подразумевал консоль самой системы.



"MySQL Collation, Character Cp1251"
Отправлено pavlinux , 17-Янв-11 15:59 
>>> Системная локаль тоже на CP1251, т.к. ....
>> А выше:
>>> mysql> SHOW VARIABLES LIKE 'character_set%';
>>> ...
>>>| character_set_system     | utf8                             |
>>>
> Этот параметр, если не ошибаюсь, изменить вообще нельзя?

Можно, но не нужно :)
> Подразумевал консоль самой системы.

http://www.lissyara.su/articles/freebsd/www/mysql_charsets/


"MySQL Collation, Character Cp1251"
Отправлено kvasik , 18-Янв-11 18:16 
>> Этот парам...

Скорее всего, заставить отображать пути директорий с кодировкой CP1251 пока так и не получится.

При бэкапе данные заносятся в базу под пользователем bacula, кодировка для клиентов установлена CP1251. Другую кодировку указать нельзя, т.к. система содержит пути файлов в CP1251. Внесённые данные успешно просматриваются при коннекте mysql в cmd.exe с установкой chcp1251.

Webacula понимает только UTF8 и пытается тянуть данные из этой базы.

P.S. если указать в .htacces кодировку CP1251 для страницы по умолчанию, ситуация с путями директорий не поменяется.
P.P.S если кто знает как заставить понимать Webacula CP1251, напишите пож. :)



"MySQL Collation, Character Cp1251"
Отправлено universite , 18-Янв-11 18:40 
>>> Этот парам...
> Скорее всего, заставить отображать пути директорий с кодировкой CP1251 пока так и
> не получится.

воспользуйтесь iconv



"MySQL Collation, Character Cp1251"
Отправлено pavlinux , 18-Янв-11 18:57 
>[оверквотинг удален]
> Скорее всего, заставить отображать пути директорий с кодировкой CP1251 пока так и
> не получится.
> При бэкапе данные заносятся в базу под пользователем bacula, кодировка для клиентов
> установлена CP1251. Другую кодировку указать нельзя, т.к. система содержит пути файлов
> в CP1251. Внесённые данные успешно просматриваются при коннекте mysql в cmd.exe
> с установкой chcp1251.
> Webacula понимает только UTF8 и пытается тянуть данные из этой базы.
> P.S. если указать в .htacces кодировку CP1251 для страницы по умолчанию, ситуация
> с путями директорий не поменяется.
> P.P.S если кто знает как заставить понимать Webacula CP1251, напишите пож. :)

Вот ты себе гимор придумал. Говорю же гони всё в UTF8, и локаль FreeBSD тоже.
а  Webacula это всего лишь вебприложение и перекодировка выставляется в браузере.


"MySQL Collation, Character Cp1251"
Отправлено kvasik , 20-Янв-11 17:52 
> Вот ты себе...

Да, не ищем лёгких путей :)
Установил клиента на оригинальный Windows :) с него снялся бэкап и веб-интерфейс выдал всю красоту.
CP1251 на консоли FreeBSD (с которого ранее снимал бэкап) это все от лукавого :)
Но иногда без него не обойтись (vsftpd ru version).