31 января, 2012

OCS Inventory NG и 500-я ошибка

Сегодня коллеги попросили помочь разобраться с проблемой: при отправке данных в OCS агент получал в ответ ошибку с кодом 500. После включения логирования ошибок (нужно в конфиге выставить OCS_OPT_DBI_PRINT_ERROR в 1) в логах появились следующие ошибки:

DBD::mysql::db do failed: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' at /usr/local/share/perl/5.10.1/Apache/Ocsinventory/Server/Inventory/Cache.pm line 34.

Вот на этом месте OCS спотыкается:

# sed '260,265p;d' /usr/local/share/perl/5.10.1/Apache/Ocsinventory.pm
  # Retrieve Device if exists
  $request = $CURRENT_CONTEXT{'DBI_HANDLE'}->prepare('
    SELECT DEVICEID,ID,UNIX_TIMESTAMP(LASTCOME) AS LCOME,UNIX_TIMESTAMP(LASTDATE) AS LDATE,QUALITY,FIDELITY 
    FROM hardware WHERE DEVICEID=?'
  );
  unless($request->execute($CURRENT_CONTEXT{'DEVICEID'})){

Ну тут всё понятно - имя в кириллице, меняем на латиницу - всё работает. Проблема локализована. А чтобы OCS могла импортировать имена в кириллице нужно немного поправить БД:

ALTER TABLE `ocs`.`hardware` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE `ocs`.`hardware` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Ну а лучше не полениться и конвертировать всю БД простым скриптом на PHP:

<?php
$connection = mysql_connect('localhost', 'debian-sys-maint', '**************') or die ('Could not connect to server');
mysql_select_db('ocs', $connection) or die ('Could not select DB');
mysql_query("alter database `ocs` default character set 'utf8' collate 'utf8_general_ci'", $connection);
$result = mysql_query("show tables", $connection);
while($row = mysql_fetch_row($result)) {
   mysql_query("alter table `$row[0]` convert to character set 'utf8' collate 'utf8_general_ci'", $connection);
   mysql_query("alter table `$row[0]` default character set 'utf8' collate 'utf8_general_ci'", $connection);
}

Те, кто заранее позаботился о настройке сервера с этой проблемой не столкнутся, достаточно двух строчек в /etc/my.cnf:

default-character-set   = utf8  
default-collation       = utf8_general_ci

Естественно настраивать надо было до установки OCS

Комментариев нет:

Отправить комментарий