Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вставка юникодных символов в базу 
V
    Опции темы
infarch
Дата 5.9.2012, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Здравствуйте.

Помогите пожалуйста понять в чем ошибка. Мне нужно вставить строку с юникодными символами в базу Sql Server. Написал простенький скрипт для тестирования. Работает нормально под виндой, но если запустить под убунту (сервер) то выдает ошибку. Вот скрипт:

Код

use strict;
use warnings;

use lib ("/bb_projekt/docia/perl/lib");

use DBI;

use Backbone::Sql;
use Docia::Conf;

my $dbh;

# open database handle
if(defined $constants{Database}{DB_TYPE} && $constants{Database}{DB_TYPE} eq "sybase") {
    # open database handle (linux version)
    $dbh = DBI->connect( 'dbi:Sybase:Byggeweb',$constants{Database}{DB_USER}, $constants{Database}{DB_PASSWORD},
        { RaiseError => 0, AutoCommit => 0, syb_chained_txn => 0 })
        || die "Database connection not made: " . DBI->errstr();
    ($dbh->do("use ".$constants{Database}{DB_NAME}) != -2) or die "Cannot switch to Byggeweb";
} else {
    # open database handle (windows version)
    $dbh = DBI->connect("dbi:ODBC:driver={SQL Server};Server=".$constants{Database}{DB_SERVER}.";database=".$constants{Database}{DB_NAME}.";uid=".$constants{Database}{DB_USER}.";pwd=".$constants{Database}{DB_PASSWORD}.";",
        undef,undef,{ RaiseError => 0, AutoCommit => 0 })    or die "Connect to ".$constants{Database}{DB_SERVER}." failed: $DBI::errstr";
    $dbh->{LongReadLen} = 512000;
}

my $name = 'testdata_' . time;
print "Creating a test element '$name'\n";
my $string = "english \x{263a}";

# insert a new element
Backbone::Sql::doQuery($dbh, sql=>"insert into [NameValue] ([Name],[ValueStr]) values (?,?)", args=>[$name, $string]);
$dbh->commit();

# get it back
my ($row) = Backbone::Sql::doQuery($dbh, sql=>"select * from [NameValue] where [Name]=?", args=>[$name]);

# compare
if($string eq $row->{ValueStr}){
    print "Success\n";
}else{
    print "Failed\n";
}


Ошибка под убунтой (возникает при инсерте): 
DBD::Sybase::st execute failed: OpenClient message: LAYER = (0) ORIGIN = (0) SEVERITY = (9) NUMBER = (98) Server Byggeweb, database Byggeweb
Message String: Error converting characters into server's character set. Some character(s) could not be converted

Может кто подскажет как это лечить? Пишите, предоставлю любые нужные конфиги для анализа.

PM MAIL   Вверх
arto
Дата 5.9.2012, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



указать charset?
PM MAIL ICQ   Вверх
infarch
Дата 5.9.2012, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



А где указать то? Подскажите пожалуйста с примером )

PM MAIL   Вверх
arto
Дата 5.9.2012, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



похоже, документацию вы не читали.
perldoc DBD::Sybase
PM MAIL ICQ   Вверх
infarch
Дата 5.9.2012, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



В том то и дело что читал, только вот не получилось у меня так сделать...
Если я писал конект в форме отличной от 'dbi:Sybase:Byggeweb',$constants{Database}{DB_USER}, $constants{Database}{DB_PASSWORD} то получал ошибку. Здесь dbi:Sybase:Byggeweb имя секции конфига FreeTDS. А там и написано как документация говорит: client charset = UTF-8


PM MAIL   Вверх
arto
Дата 5.9.2012, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# LC_ALL=en_GB.UTF-8 SYBASE=/opt/sybase perl -MDBI -MDBD::Sybase -le '$dbi = DBI->connect(@ARGV[0,1,2]) or die $DBI::errstr; $dbi->do("insert into test(name) values (''$ARGV[3]'')")' "dbi:Sybase:server=A;database=pubs3;charset=utf8" "sa" "pass" "В том то и дело что читал"
# sqsh -S A -U sa -P pass -p -Dpubs3 -C "select * from test;"     15:41 (0)
...
 name                                                                            
 --------------------------------------------------------------------------------
 test                                                                            
 В том то и дело что читал                                    

(2 rows affected)
Clock Time (sec.): Total = 0.001  Avg = 0.001 (915.75 xacts per sec.)
#

Это сообщение отредактировал(а) arto - 5.9.2012, 15:43
PM MAIL ICQ   Вверх
infarch
Дата 5.9.2012, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Ваши однострочники - сами по себе песня ) Спасибо, в таком варианте удалось установить связь с базой и не свалиться с ошибкой:

Код

my $dbh = DBI->connect('dbi:Sybase:server=Byggeweb;database=Byggeweb;charset=utf8',
$constants{Database}{DB_USER}, $constants{Database}{DB_PASSWORD},
 { RaiseError => 0, AutoCommit => 0,syb_chained_txn => 0 }));


Однако ошибка осталась на месте: 
DBD::Sybase::st execute failed: OpenClient message: LAYER = (0) ORIGIN = (0) SEVERITY = (9) NUMBER = (98) Server Byggeweb, database Byggeweb
Message String: Error converting characters into server's character set. Some character(s) could not be converted


Позвольте спросить: что означает вот это # LC_ALL=en_GB.UTF-8 SYBASE=/opt/sybase ? Поясните пожалуйста человеку практически не знакомому с линуксом. Может тут у меня проблема?
PM MAIL   Вверх
arto
Дата 5.9.2012, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



это переменные окружения.
а какой charset у таблицы стоит?
и какую строку вы пытаетесь запихнуть? у нее utf8 флаг стоит?
PM MAIL ICQ   Вверх
infarch
Дата 6.9.2012, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



test-deployer@linux-bw-test:~$ locale
LANG=en_DK.UTF-8
LC_CTYPE="en_DK.UTF-8"
LC_NUMERIC="en_DK.UTF-8"
LC_TIME="en_DK.UTF-8"
LC_COLLATE="en_DK.UTF-8"
LC_MONETARY="en_DK.UTF-8"
LC_MESSAGES="en_DK.UTF-8"
LC_PAPER="en_DK.UTF-8"
LC_NAME="en_DK.UTF-8"
LC_ADDRESS="en_DK.UTF-8"
LC_TELEPHONE="en_DK.UTF-8"
LC_MEASUREMENT="en_DK.UTF-8"
LC_IDENTIFICATION="en_DK.UTF-8"
LC_ALL=

Засовываю в таблицу я вот это: my $string = "english \x{263a}";
Не знаю стоит ли там флаг, честно говоря я в этом перловом юникоде не силен. Подскажете как глянуть?

Чарсет таблицы - что это? Колейшен базы данных SQL_Danish_Pref_CP1_CI_AS. Надо поменять? На какой? Поля в таблице nvarchar.

PM MAIL   Вверх
arto
Дата 6.9.2012, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



у вас en_DK.utf8 в locales.dat есть?

попробуйте поставить use utf8.
PM MAIL ICQ   Вверх
infarch
Дата 6.9.2012, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Подскажите, где искать этот locales.dat ? В папке freetds есть файл locales.conf, там прописано:

[en_DK]
        date format = %b %d %Y %I:%M%p
        language = us_english
        char set = utf8

use utf8 поставил, не помогло.
PM MAIL   Вверх
arto
Дата 6.9.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



на сервере, $SYBASE/locales/locales.dat

попробуйте установить флаг utf8 у строки и проверить его наличие (perldoc utf8)
PM MAIL ICQ   Вверх
infarch
Дата 6.9.2012, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



echo $SYBASE вернул мне пустую строку. И судя по тому что мне попалось из информации, ставить его надо так: export SYBASE=/usr/local/freetds, указав куда поставлен фритдс. в той папке у меня locales.dat нет, только locales.conf

is_utf говорит что флаг выставлен
PM MAIL   Вверх
arto
Дата 6.9.2012, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



freetds -- это клиент.
вам надо смотреть на сервер, где вертится ваша база данных.
PM MAIL ICQ   Вверх
infarch
Дата 6.9.2012, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



База данных на виндовс машине. А что там смотреть то?
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.