Всем, привет!
Задача простая, нужно из perl-скрипта получить данные из MS SQL Server 2008 и после обработки выдать отчет через apache2.
Установил драйвер ODBC - FreeTDS.
Установил DBD:ODBC (unicode).
С помощью клиентов таких как isql, fisql, osql, psql запрос:
select TaskName from MSP_EpmTask_UserView where TaskName like N'Этап 1 Н%'
- отрабатывает нормально.
А вот с cgi-скриптом проблема. Из консоли скрипт отрабатывает, а из браузера нет. Точнее скрипт из браузера отрабатывает без ошибок, но в запросе, то что на русском языке после "like" отправляется в непонятой для SQL-сервера кодировке(если после like на английском - проблемы нет). В связи с этим вопрос, чем отличатся (в плане кодировок) запуск скриптов из консоли и из браузера? Вот сам скрипт:
#!/usr/bin/perl -w
use strict;
use warnings FATAL => 'all';
use utf8;
use open qw(:std :utf8);
use Encode;
use CGI qw(:all);
use DBI;
use DBD::ODBC;
my $data_source = q(dbi:ODBC:MSSQL-SHPOINT);
my $user = q(report_pwa);
my $password = q(12345qweR);
# Соединение с базой данных
my $dbh = DBI->connect($data_source, $user, $password)
or die "Can't connect to $data_source: $DBI::errstr";
my $LIKE = "N\'Этап 1 Н%\'";
my $sql = "select TaskName from MSP_EpmTask_UserView where TaskName like $LIKE";
$sql = encode('utf8', $sql);
my $q = new CGI;
my $sth = $dbh->prepare($sql)
or die "Can't prepare statement: $DBI::errstr";
$sth->execute();
# Начало страницы
print $q->header(-type=>'text/html', -charset=>'utf-8');
print $q->start_html();
# Начало таблицы
print $q->start_table({cellspacing=>0});
# делать выборку данных пока ничего не останется
my @string = ();
while ( @string = $sth->fetchrow_array()) {
print $q->start_Tr();
print $q->td("$string[0]");
print $q->end_Tr()."\n";
}
print $q->end_table()."\n";
#Конец таблицы
print $q->end_html()."\n";
# Конец страницы
# Отключение от базы данных
$sth->finish();
$dbh->disconnect;
exit 0;
Результат в консоли:
Content-Type: text/html; charset=utf-8
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Тест</title>
<link rel="stylesheet" type="text/css" href="/css/style1.css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<table cellspacing="0"><caption>Привет!</caption>
<tr><th>TaskName</th></tr>
<tr><td>Этап 1 Настройка первоочередных функциональных ролей</td></tr>
</table>
</body>
</html>
Результат в браузере:
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Тест</title>
<link rel="stylesheet" type="text/css" href="/css/style1.css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<table cellspacing="0"><caption>Привет!</caption>
<tr><th>TaskName</th></tr>
</table>
</body>
</html>