Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
BorisPlus
Member

Откуда:
Сообщений: 43
День добрый
Помогите разобраться с кодировкой строк при вставке с использованием Perl DBI в базу MSSQL
Есть база в MSSQL с кодировкой по-умолчанию SQL_latin1_general_CP1_CI_AS.
Выборка из нее пока в тестовом режиме делается с помощью SQL Management Studio через обычный SELECT.
Сам скрипт в UTF8 без BOM. В базу вставляется всякая абракадабра кодировочная, но только не русский язык. как быть? все это под линукс запускается.

Спасибо заранее

+
#!/usr/bin/perl 
use DBI;
use Text::Iconv;
use Encode;

our $db_host="192.168.0.1";
our $db_port="1433";
our $db_name="test";
our $db_login="test";
our $db_password="test";

$dbh = DBI->connect("DBI:Sybase:server=$db_host:$db_port;database=[$db_name];charset=utf8", "$db_login", "$db_password");
print "CONNECTED\n"; 

$dbh->do("USE [$db_name]");
print "USE [$db_name]\n";

$dbh->do("DROP TABLE [test]");
$dbh->do("IF NOT EXISTS (SELECT * FROM [$db_name].INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'test')
CREATE TABLE [$db_name].[dbo].[test](
	[test_field_1] [nvarchar](max) COLLATE sql_latin1_general_cp1251_CI_AS,	
	[test_field_2] [nvarchar](max) COLLATE latin1_general_CI_AS,	
	[test_field_3] [nvarchar](max) COLLATE cyrillic_general_CI_AS
) ON [PRIMARY]");
print "CREATED\n";

my $i =1;

my $test_value = "xАБВx";	

print "TEST ",$i++,"\n";
my $inserted_value = $test_value;
print  $inserted_value," ";
$dbh->do("INSERT INTO [test] (test_field_1,test_field_2,test_field_3) VALUES (N'$inserted_value',N'$inserted_value',N'$inserted_value')");	
print "INSERTED\n";

print "TEST ",$i++,"\n";
print  Encode::is_utf8($inserted_value),"\n";
Encode::_utf8_off($inserted_value);
print  $inserted_value," ";
$dbh->do("INSERT INTO [test] (test_field_1,test_field_2,test_field_3) VALUES (N'$inserted_value',N'$inserted_value',N'$inserted_value')");	
print "INSERTED\n";

print "TEST ",$i++,"\n";
Encode::from_to($inserted_value ,'utf8','latin1');
print  $test_value," ";
$dbh->do("INSERT INTO [test] (test_field_1,test_field_2,test_field_3) VALUES (N'$inserted_value',N'$inserted_value',N'$inserted_value')");	
print "INSERTED\n";

print "TEST ",$i++,"\n";
$inserted_value = $test_value;
Encode::_utf8_off($inserted_value);
Encode::from_to($inserted_value ,'utf8','windows-1251');
print  $inserted_value," ";
$dbh->do("INSERT INTO [test] (test_field_1,test_field_2,test_field_3) VALUES (N'$inserted_value',N'$inserted_value',N'$inserted_value')");
print "INSERTED\n";

print "TEST ",$i++,"\n";
$inserted_value = $test_value;
Encode::_utf8_off($inserted_value);
Encode::from_to($inserted_value ,'utf8','cp1250');
print  $inserted_value," ";
$dbh->do("INSERT INTO [test] (test_field_1,test_field_2,test_field_3) VALUES (N'$inserted_value',N'$inserted_value',N'$inserted_value')");
print "INSERTED\n";

print "TEST ",$i++,"\n";
$inserted_value = $test_value;
Encode::_utf8_off($inserted_value);
Encode::from_to($inserted_value ,'utf8','cp1252');
print  $inserted_value," ";
$dbh->do("INSERT INTO [test] (test_field_1,test_field_2,test_field_3) VALUES (N'$inserted_value',N'$inserted_value',N'$inserted_value')");
print "INSERTED\n";

print "TEST ",$i++,"\n";
$inserted_value = $test_value;
Encode::_utf8_off($inserted_value);
my $iconv = Text::Iconv->new('utf-8','windows-1251');
$inserted_value = $iconv->convert($inserted_value);
print  $inserted_value," ";
$dbh->do("INSERT INTO [test] (test_field_1,test_field_2,test_field_3) VALUES (N'$inserted_value',N'$inserted_value',N'$inserted_value')");
print "INSERTED\n";


$dbh->disconnect;
print "DISCONECTED\n";
1;


К сообщению приложен файл (test.pl - 3Kb) cкачать
25 мар 14, 17:13    [15785076]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
Glory
Member

Откуда:
Сообщений: 104751
BorisPlus
В базу вставляется всякая абракадабра кодировочная,

А что приходит на сервер, вы смотрели ?
25 мар 14, 17:16    [15785099]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
BorisPlus
Member

Откуда:
Сообщений: 43
Glory,с помощью SQL Management Studio через обычный SELECT выдается абракадабра кодировочная
25 мар 14, 18:02    [15785372]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
Glory
Member

Откуда:
Сообщений: 104751
BorisPlus
с помощью SQL Management Studio через обычный SELECT выдается абракадабра кодировочная

Как обычный SELECT покажет текст команды, которая была передана на сервер вашим скриптом ?

Обычно это показывает трассировка событий на сервере
25 мар 14, 18:04    [15785381]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
А Вы что пытаетесь прочитать, UTF-8?
Сервер не имеет специального типа данных для хранения информации в этой кодировке. MSSMS поддерживает только ANSI и UNICODE.
25 мар 14, 18:34    [15785574]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
BorisPlus
Member

Откуда:
Сообщений: 43
Владислав Колосов, да, так как исходная строка как и в весь код скрипта в utf8, то я пытаюсь конвертировать ее в "нужную/правильную" кодировку для использования в INSERT. Вот в этом и суть вопроса - каким образом мне конвертировать это строковое значение, что оно корректно отобразилось при селекте в менеджмент студио? В указанном тесте и привиден пример того, что я уже попробовал и что не дало результата.
25 мар 14, 21:40    [15786261]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
BorisPlus
Member

Откуда:
Сообщений: 43
Glory, я не учел это, этот инструментарий пока мне не знаком, завтра сделаю трассировку. Это через SQL Server Profiler?
25 мар 14, 21:44    [15786284]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
BorisPlus
Member

Откуда:
Сообщений: 43
Glory, проверил, трассировка показала, что вставляются именно те квакозябры, которые я и наблюдаю в селекте в менеджмент студии. как конвертануть в нужную кодировку то?
26 мар 14, 12:45    [15788610]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
BorisPlus
Glory, проверил, трассировка показала, что вставляются именно те квакозябры, которые я и наблюдаю в селекте в менеджмент студии. как конвертануть в нужную кодировку то?
Значит, сервер ни при чем, ковыряйте ваш Perl DBI.
26 мар 14, 12:48    [15788631]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
BorisPlus
Владислав Колосов, да, так как исходная строка как и в весь код скрипта в utf8, то я пытаюсь конвертировать ее в "нужную/правильную" кодировку для использования в INSERT. Вот в этом и суть вопроса - каким образом мне конвертировать это строковое значение, что оно корректно отобразилось при селекте в менеджмент студио? В указанном тесте и привиден пример того, что я уже попробовал и что не дало результата.

Если Вы хотите конвертировать UTF8 в ANSI, то можно, например, создать CLR функцию в MS Visual Studio и использовать её на сервере в своих процедурах.
26 мар 14, 14:39    [15789398]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
BorisPlus
Member

Откуда:
Сообщений: 43
Владислав Колосов, не хочу VS )) Хочу Linux
26 мар 14, 17:46    [15790796]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
BorisPlus
Member

Откуда:
Сообщений: 43
Гавриленко Сергей Алексеевич, в том и проблема. Я больше не нашел других вариантов, кроме указанных в приложенном скрипте. Кто может подскажет, что конкретно нужно сделать?
26 мар 14, 17:48    [15790808]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
bdmalex
Member

Откуда: Москва
Сообщений: 612
Я бы в первую очередь посмотрел на версию библиотеки DBI и при необходимости обновил её.

И ещё с Oracle была отдельная библиотека DBD-Oracle, что-то подозреваю, что и для Sybase должна быть аналогичная...
26 мар 14, 19:53    [15791283]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
BorisPlus
Member

Откуда:
Сообщений: 43
bdmalex, посмотрю, но вроде все из репозиториев текущих. но попробую.
28 мар 14, 07:29    [15798581]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
volodin661
Member

Откуда: Внутренняя Монголия
Сообщений: 530
BorisPlus,

если ты рассказываешь, что текст скрипта в UTF-8,
то где же тогда строчка

 
use utf8;
 
?
в противном случае Perl-у не разобраться, что это так,
на наличие BOM он пока что не закладывается.

то есть,
если ты пишешь

use utf8;
my $test_value = "xАБВx";	
,

и сохраняешь файл в кодировке UTF-8,
то тогда можете быть оба( ты и перл) уверены,
что "xАБВx" лежит в UTF8 представлении.
29 мар 14, 19:09    [15805602]     Ответить | Цитировать Сообщить модератору
 Re: Perl DBI (Sybase) + MSSQL проблема с кодировкой при вставке  [new]
volodin661
Member

Откуда: Внутренняя Монголия
Сообщений: 530
PS:
у Майкрософта сейчас имеется драйвер ODBC под Линукс*,
обеспечивающий соединение с MSSQL и поддерживающий
полную функциональность MS SQL Native Client и утилиты
sqlcmd в полном объёме.


* только RHEL/Centos ( устанавливал, работает)
и SUSE ( не проверял)


Microsoft ODBC Driver 11 for SQL Server
29 мар 14, 19:31    [15805671]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить