![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Здравствуйте.
Помогите пожалуйста понять в чем ошибка. Мне нужно вставить строку с юникодными символами в базу Sql Server. Написал простенький скрипт для тестирования. Работает нормально под виндой, но если запустить под убунту (сервер) то выдает ошибку. Вот скрипт:
Ошибка под убунтой (возникает при инсерте): 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 Может кто подскажет как это лечить? Пишите, предоставлю любые нужные конфиги для анализа. |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
указать charset?
|
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
А где указать то? Подскажите пожалуйста с примером )
|
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
похоже, документацию вы не читали.
perldoc DBD::Sybase |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
В том то и дело что читал, только вот не получилось у меня так сделать...
Если я писал конект в форме отличной от 'dbi:Sybase:Byggeweb',$constants{Database}{DB_USER}, $constants{Database}{DB_PASSWORD} то получал ошибку. Здесь dbi:Sybase:Byggeweb имя секции конфига FreeTDS. А там и написано как документация говорит: client charset = UTF-8 |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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 |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Ваши однострочники - сами по себе песня ) Спасибо, в таком варианте удалось установить связь с базой и не свалиться с ошибкой:
Однако ошибка осталась на месте: 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 ? Поясните пожалуйста человеку практически не знакомому с линуксом. Может тут у меня проблема? |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
это переменные окружения.
а какой charset у таблицы стоит? и какую строку вы пытаетесь запихнуть? у нее utf8 флаг стоит? |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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. |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
у вас en_DK.utf8 в locales.dat есть?
попробуйте поставить use utf8. |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 поставил, не помогло. |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
на сервере, $SYBASE/locales/locales.dat
попробуйте установить флаг utf8 у строки и проверить его наличие (perldoc utf8) |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
echo $SYBASE вернул мне пустую строку. И судя по тому что мне попалось из информации, ставить его надо так: export SYBASE=/usr/local/freetds, указав куда поставлен фритдс. в той папке у меня locales.dat нет, только locales.conf
is_utf говорит что флаг выставлен |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
freetds -- это клиент.
вам надо смотреть на сервер, где вертится ваша база данных. |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
База данных на виндовс машине. А что там смотреть то?
|
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
с windows я не работал.
|
|||
|
||||
| infarch |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Я склоняюсь к тому что проблема не сервере базы данных. Мне таки удалось передать юникод с линукса в базу. Однако скрипт запускался апачем и принимал данные из CGI. Далее, я использовал не плейсхолдеры, а прямой запрос. Вот так:
B таком варианте я получил в базе корректные данные. Если же я использовал плейсхолдеры то картина иная. Вот такой вот скрипт:
При вставке строки из цифр и английских символов все хорошо. Если же субмитнуть еще и русские и прочие юникодные символы то вставляется пустое значение. Прямое указание типа при байнде ничего не изменило:
Однако мне очень нужны плейсхолдеры, это ключевой момент в проекте. И поэтому я буду крайне благодарен за помощь. Еще один момент... Я пробовал связаться с базой используя unixODBC и драйвер для sql server от EasySoft. Плейсхолдеры заработали, но кричать Ура рано: во-первых там надо указывать тип данных, причем всегда ("$sth->bind_param(1, $string, {TYPE => SQL_WVARCHAR});"), во-вторых драйвер платный и нужная лицензия потянет евро так на 5000. Так что фритдс и сибейс крайне желательны. Это сообщение отредактировал(а) infarch - 7.9.2012, 12:09 |
||||||
|
|||||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
# LC_ALL=en_GB.UTF-8 SYBASE=/opt/sybase perl -CSA -MDBI -MDBD::Sybase -le '$dbi = DBI->connect(@ARGV[0,1,2]) or die $DBI::errstr; $sth = $dbi->prepare("insert into test(name) values (?)") or die $dbh->errstr; $sth->execute($ARGV[3]);' "dbi:Sybase:server=A;database=pubs3;charset=utf8" "sa" "pass" "В том то и дело что читал + 1"
# sqsh -S A -U sa -P pass -p -Dpubs3 -C "select * from test;" ... name -------------------------------------------------------------------------------- test В том то и дело что читал В том то и дело что читал + 1 (3 rows affected) Clock Time (sec.): Total = 0.001 Avg = 0.001 (895.26 xacts per sec.) # ldd /usr/local/lib/perl/5.12.4/auto/DBD/Sybase/Sybase.so linux-vdso.so.1 => (0x00007fff64b59000) libsybct64.so => /opt/sybase/OCS-15_0/lib/libsybct64.so (0x00002b8d985d0000) libsybcs64.so => /opt/sybase/OCS-15_0/lib/libsybcs64.so (0x00002b8d98868000) libsybblk64.so => /opt/sybase/OCS-15_0/lib/libsybblk64.so (0x00002b8d98a7c000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00002b8d98cbe000) libsybtcl64.so => /opt/sybase/OCS-15_0/lib/libsybtcl64.so (0x00002b8d9905f000) libsybcomn64.so => /opt/sybase/OCS-15_0/lib/libsybcomn64.so (0x00002b8d99287000) libsybintl64.so => /opt/sybase/OCS-15_0/lib/libsybintl64.so (0x00002b8d99545000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00002b8d9974e000) libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00002b8d99953000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00002b8d99b6d000) libsybunic64.so => /opt/sybase/OCS-15_0/lib/libsybunic64.so (0x00002b8d99df1000) /lib64/ld-linux-x86-64.so.2 (0x00002b8d9818a000) # Как видно работает. Правда DBD слинкован с оригинальными библиотеками, не с TDS. Попробуйте выставить LC_ALL как у меня, если не заработает, попробуйте взять с sybase.com библиотеки. |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Выставил LC_ALL, ничего не изменилось.
test-deployer@linux-bw-test:/usr/local/lib/perl/5.8.8/auto/DBD/Sybase$ ldd Sybase.so libct.so.4 => /usr/local/freetds/lib/libct.so.4 (0x00002ac5ff4f5000) libtds.so.5 => /usr/local/freetds/lib/libtds.so.5 (0x00002ac5ff749000) libdl.so.2 => /lib/libdl.so.2 (0x00002ac5ff98c000) libm.so.6 => /lib/libm.so.6 (0x00002ac5ffb90000) libc.so.6 => /lib/libc.so.6 (0x00002ac5ffe12000) librt.so.1 => /lib/librt.so.1 (0x00002ac600164000) libpthread.so.0 => /lib/libpthread.so.0 (0x00002ac60036d000) /lib64/ld-linux-x86-64.so.2 (0x0000555555554000) Вам это о чем либо говорит? На сибейсе вообще непонятно где качать либы ( Можете дать ссылку? |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
у вас слинковано с FreeTDS.
ASE for Linux смотреть здесь: http://response.sybase.com/forms/ASE_Linux_Download Я не помню, поставляют они библиотеки для клиента отдельно, или нет. |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
btw, вы читали README.freetds из DBD::Sybase?
Missing Features: ----------------- * ?-style placeholders are not supported. * Setting $dbh->{LongReadLen} doesn't work Use $dbh->do("set textsize <value>") instead. * The special text/image handling functions don't work (i.e. ct_fetch_data(), etc). * The $dbh->{syb_row_count} attribute doesn't work. Use $dbh->do("set rowcount <value>") instead. * The $dbh->{syb_quoted_identifier} attribute doesn't work. Use $dbh->do("set quoted_identifier <value>") instead. |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Боюсь я что клиент не захочет ставить еще и это :( 800 метров, явно не только либы там лежат... Кстати, гляньте вот на это: http://www.nntp.perl.org/group/perl.dbi.us...0/msg34271.html
Вы не знаеет о чем там речь? Что это за unixODBC/CVS + FreeTDS/CVS? Добавлено через 2 минуты и 36 секунд
Не читал... Действительно, намек прозрачный. Но ведь они таки работают! Только с юникодом проблема, а так то все в порядке. |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
вы какую версию протокола поставили в freetds.conf?
и какую поддерживает ваш сервер? у меня на сервере ASE 15.7.0, прописал tds version = 5.0, и отработало perl -Mblib -CSA -MDBI -MDBD::Sybase -le '$dbi = DBI->connect(@ARGV[0,1,2]) or die $DBI::errstr; $sth = $dbi->prepare("insert into test(name) values (?)") or die $dbh->errstr; $sth->execute($ARGV[3]);' "dbi:Sybase:server=A;charset=utf8;database=pubs3" |
|||
|
||||
| urbano |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 15.3.2012 Репутация: нет Всего: нет |
в Дойч банк'е программируете?
они там поддерживает одну систему на perl и она через 1 год само уничтожиться весь проект на разных языках |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
это кому вопрос?
|
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Я не в Дойч, но система на перл, жава, сишарп... Уже лет 10 как живет, и умирать пока не собирается
|
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Кстати, я вот еще что заметил: сибейс не возвращает мне юникодные строки с выставленным флагом ютф.
На проверке получаю ноль, хотя выставил и charset=utf8, и syb_enable_utf8=>1. А если под виндой, через ODBC, то выставляет флаг коректно. Не подскажете как это вылечить? |
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
# perl -Mutf8 -Mblib -CSA -MDBI -MDBD::Sybase -le '$dbi = DBI->connect(@ARGV[0,1,2]) or die $DBI::errstr; $sth = $dbi->prepare("select * from test") or die $dbh->errstr; $sth->execute(); while (my ( $a ) = $sth->fetchrow) { utf8::decode($a); print $a }' "dbi:Sybase:server=A;charset=utf8;database=pubs3" "sa" "pass"
test В том то и дело что читал В том то и дело что читал + 1 |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Вы используете decode... Следует ли это понимать так что вы тоже получаете строки без флага? Так я как раз и хочу это исправить... Или о чем вы хотели сказать?
|
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
В общем я понял что с сибейс каши не сваришь... И в результате переехал на DBD::ODBC. Использую UnixODBC и FreeTDS как драйвер. И все заработало. Закрываю тему.
|
|||
|
||||
| arto |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
это freetds не понимает utf8, с openclient нормально.
декодируйте полученый контент. |
|||
|
||||
| infarch |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 526 Регистрация: 13.3.2009 Репутация: нет Всего: 1 |
Да не хочу я ничего декодировать. Мне нужно чтобы я вообще не думал на какой платформе работает сайт. Конекшен к базе я делаю в одном единственном модуле, там я еще могу проверить окружение и создать датабейс хендлер по вкусу. Дальше уже все усложняется, выборки и вставки бывают самые разные и в неожиданных местах. Я не буду вставлять декод в сотне модулей. Так что после некоего терморектального воздействия на клиента мы решили перейти на одбц везде. Это еще больше нас приближает к стандартизации работы с базой. Заодно и на новый линукс переехали )
Это сообщение отредактировал(а) infarch - 13.9.2012, 17:18 |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |