Perl, DBI, utf8

Решил написать скриптик генерации статического контента по базе данных, содержащей каталог картинок и текстов. Так сказать, заменить серверный движок оным генератором. Руками делать страницы — неблагодарное занятие в силу необходимости сгенерить большое количество междустраничных ссылок и т.д. и т.п.

Имевшийся готовый генератор html-галереи не подошел, потому что не умел коллекционировать теги и генерировать по ним тематические каталоги.

Поскольку требовалось сделать страницы в кодировке Windows (cp1251), то лучше всего и быстрее всего было бы сделать это на Visual FoxPro — потому что базу проектировать и пополнять удобно. А писать еще и интерфейс для ввода данных мне лень.

Но лицензионного VFP у меня нету (Windows, если поискать, найдется).

Первая приходящая на ум альтернатива — HSQLDB. Но уж больно она аскетична, да и не очень хочется на J2SE писать, для такого Perl больше подходит. И обратились мои взоры к хорошо знакомому MySQL 5, для которого имеется опять-таки свободный phpMyAdmin, который я и намерен использовать для ввода данных. А при необходимости в базе MySQL и файлы можно хранить будет (бэкапить все это хозяйство одним файлом проще).
Забил немного тестовых данных. Как и положено правильному юзеру, все таблицы в базе — в utf8.

Оказывается, Perl не понимает utf8. Задница.

Исследования показали, что в последние несколько месяцев сия проблема активно решалась, однако часть юзеров мигрировала на PostgreSQL, DBD-драйвер которого имел кривую, но работающую поддержку UTF.

Поставил свеженький драйвер DBI:mysql. Нашел. как это должно выглядеть в коде. Примерно так.


#!/usr/bin/perl
...
use DBI;
use encoding 'utf8';
...
$dbh = DBI->connect("DBI:mysql:$database:$hostname",$user, $password);
open(FL, "> catalog.html") || die "Can't open file \n";
binmode(FL, ":utf8");
print FL <<EOF;
абвгдеё\n
123456\n
EOF
$dbh->do("set character set utf8");
$dbh->do("set names utf8");
$statement="select * from tag";
$sth = $dbh->prepare($statement) or die "Can't prepare $statement: $dbh->errstr\n";
$rv = $sth->execute or die "can't execute the query: $sth->errstr";
while(@row = $sth->fetchrow_array) {
print FL "$row[0] $row[1]\n";
}
$sth->finish;
close FL;

Вот без SET NAMES — не работает.

Ну хорошо, хоть так.

Реклама

1 комментарий

Filed under DBMS, design, drivers, internet, MySQL, Perl

One response to “Perl, DBI, utf8

  1. А если попробовать так?
    DBI->connect(«DBI:mysql:$database:$hostname»,$user, $password, { mysql_enable_utf8 => 1 });

Добавить комментарий

Please log in using one of these methods to post your comment:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s