Доброй ночи.
Извечная проблема совместимоти кодировок 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' не могу понять...
>>Для удобства установил Webacula, а заодно и Bat. С этими примочками вышла аказия: на >>веб-интерфейсе, при отображении списка бекапных файлов, где должны быть кириллические >>имена -отображаются пустые строки, а в Bat вопросики.вы не туда полезли, вы проверьте поток тсп от веб сервера и посмотрите что там за символы, есть ли они, в какой они кодировке. а уже потом грешите на программу и sql сервер.
>>проверьте поток тсп от веб сервера и посмотрите что там за символы, есть ли они, в какой они кодировке...Что вы имеете ввиду под потоком тсп, как его посмотреть? Страница с веб-интерфейсом на русском языке, он корректно отображается. Фрагмент исходного кода странички, где зафиксированы пути расположения файлов выглядит так:
<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>такие пироги...
> <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 идет речь?
> Откуда мог взяться в нашей таблице 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?
Пущай перекодировкой занимаются клиенты.
>> Откуда мог взяться в нашей таблице CHARACTER SET 'binary' не могу понять...
> Может VARCHAR вместо Блоба?
> Ну и второе, если системная локаль UTF8, то нафига создавать базы и
> таблицы в CP1251?
> Пущай перекодировкой занимаются клиенты.Изменил на VARCHAR(500) ситуация изменилась, на веб-интерфейсе уже начали появляться разные символы :) Думаю, ещё поиграться с кодировками и все заработает как надо.
Системная локаль тоже на CP1251, т.к. приходится крутить виндовозные файлы.2NuINu Bat(Bacula Administration Tool) отдельеное приложение, судя по всему, механизм взаимодействия работает несколько иначе, чем веб.
> Системная локаль тоже на CP1251, т.к. ....А выше:
> mysql> SHOW VARIABLES LIKE 'character_set%';
> ...
>| character_set_system | utf8 |
>
>> Системная локаль тоже на CP1251, т.к. ....
> А выше:
>> mysql> SHOW VARIABLES LIKE 'character_set%';
>> ...
>>| character_set_system | utf8 |
>>Этот параметр, если не ошибаюсь, изменить вообще нельзя?
Подразумевал консоль самой системы.
>>> Системная локаль тоже на CP1251, т.к. ....
>> А выше:
>>> mysql> SHOW VARIABLES LIKE 'character_set%';
>>> ...
>>>| character_set_system | utf8 |
>>>
> Этот параметр, если не ошибаюсь, изменить вообще нельзя?Можно, но не нужно :)
> Подразумевал консоль самой системы.
>> Этот парам...Скорее всего, заставить отображать пути директорий с кодировкой CP1251 пока так и не получится.
При бэкапе данные заносятся в базу под пользователем bacula, кодировка для клиентов установлена CP1251. Другую кодировку указать нельзя, т.к. система содержит пути файлов в CP1251. Внесённые данные успешно просматриваются при коннекте mysql в cmd.exe с установкой chcp1251.
Webacula понимает только UTF8 и пытается тянуть данные из этой базы.
P.S. если указать в .htacces кодировку CP1251 для страницы по умолчанию, ситуация с путями директорий не поменяется.
P.P.S если кто знает как заставить понимать Webacula CP1251, напишите пож. :)
>>> Этот парам...
> Скорее всего, заставить отображать пути директорий с кодировкой CP1251 пока так и
> не получится.воспользуйтесь iconv
>[оверквотинг удален]
> Скорее всего, заставить отображать пути директорий с кодировкой CP1251 пока так и
> не получится.
> При бэкапе данные заносятся в базу под пользователем bacula, кодировка для клиентов
> установлена CP1251. Другую кодировку указать нельзя, т.к. система содержит пути файлов
> в CP1251. Внесённые данные успешно просматриваются при коннекте mysql в cmd.exe
> с установкой chcp1251.
> Webacula понимает только UTF8 и пытается тянуть данные из этой базы.
> P.S. если указать в .htacces кодировку CP1251 для страницы по умолчанию, ситуация
> с путями директорий не поменяется.
> P.P.S если кто знает как заставить понимать Webacula CP1251, напишите пож. :)Вот ты себе гимор придумал. Говорю же гони всё в UTF8, и локаль FreeBSD тоже.
а Webacula это всего лишь вебприложение и перекодировка выставляется в браузере.
> Вот ты себе...Да, не ищем лёгких путей :)
Установил клиента на оригинальный Windows :) с него снялся бэкап и веб-интерфейс выдал всю красоту.
CP1251 на консоли FreeBSD (с которого ранее снимал бэкап) это все от лукавого :)
Но иногда без него не обойтись (vsftpd ru version).