BerkeleyDB хранит байты ("октеты"). Строки Perl состоят из символов Perl. Чтобы хранить символы Perl в хранилище на основе октетов, необходимо преобразовать символы в байты. Это называется кодированием, как в кодировке символов.
Предупреждение, которое вы получаете, указывает на то, что Perl выполняет преобразование для вас и угадывает, какую кодировку символов вы хотите использовать. Поскольку он, вероятно, будет угадывать неправильно, лучше прямо сказать. Модуль Encode позволяет вам сделать это.
Вместо записи:
$db->store( key => $value );
Вместо этого вы должны написать:
use Encode qw(encode);
$db->store( key => encode('utf-8', $value) );
А на выходе:
use Encode qw(decode);
$db->get($key, $octets); # BDB returns the result via the arg list. C programmers...
my $value = decode('utf-8', $octets);
Это верно не только для BDB; всякий раз, когда вы общаетесь по сети, через файлы, через терминал или почти все, вы должны обязательно кодировать символы в октеты на выходе и декодировать октеты в символы на входе. В противном случае ваша программа не будет работа.