DB2:不管数据库代码集如何,我都应该用utf8解码提取的数据吗?

zujrkrfu  于 2023-03-08  发布在  DB2
关注(0)|答案(1)|浏览(114)

不管数据库的代码集是什么,utf-8是用于解码从DB2数据库检索到的数据的正确编码吗?

#!/usr/bin/env perl
use strict;
use warnings;
use DBI;
my ( $db, $dbh, $sth, $value );
my $table = 'mytablename';
my $user = 'user';
my $password = 'passwd';
my $char = "\x{20ac}"; # €

# ISODB code set = ISO885915
$db = 'ISODB';
$dbh = DBI->connect( "dbi:DB2:$db", $user, $password ) or die DBI->errstr;
$dbh->do( "DROP TABLE $table" );
$dbh->do( "CREATE TABLE $table (Name VARCHAR(32))" );
$sth = $dbh->prepare( "INSERT INTO $table (Name) VALUES(?)" );
$sth->execute( $char );
( $value ) = $dbh->selectrow_array( "SELECT Name FROM $table" );
printf "%v02X\n", $value;
$sth->finish;
$dbh->disconnect();

# UTFDB code set = utf-8
$db = 'UTFDB';
$dbh = DBI->connect( "dbi:DB2:$db", $user, $password ) or die DBI->errstr;
$dbh->do( "DROP TABLE $table" );
$dbh->do( "CREATE TABLE $table (Name VARCHAR(32))" );
$sth = $dbh->prepare( "INSERT INTO $table (Name) VALUES(?)" );
$sth->execute( $char );
( $value ) = $dbh->selectrow_array( "SELECT Name FROM $table" );
printf "%v02X\n", $value;
$sth->finish;
$dbh->disconnect;
# E2.82.AC
# E2.82.AC
wbrvyc0a

wbrvyc0a1#

DBD::DB2使用的编码由from the environment决定。
您可以使用$dbh->get_info查询数据库的编码和连接的编码。

use strict;
use warnings;

use DBI qw( );

use constant {
   SQL_DATABASE_CODEPAGE    => 2519,
   SQL_APPLICATION_CODEPAGE => 2520,
};

{
   my $dbh = ...;

   printf( "SQL_DATABASE_CODEPAGE:    %s\n", $dbh->get_info( SQL_DATABASE_CODEPAGE    ) );
   printf( "SQL_APPLICATION_CODEPAGE: %s\n", $dbh->get_info( SQL_APPLICATION_CODEPAGE ) );

   my $val = $dbh->selectrow_array( "SELECT * FROM ( VALUES( CHR( 201 ) ) )" );
   printf( "%v02X\n", $val );
}
$ enctest
SQL_DATABASE_CODEPAGE:    819
SQL_APPLICATION_CODEPAGE: 819   # ISO-8859-1
C9

$ DB2CODEPAGE=1208 enctest
SQL_DATABASE_CODEPAGE:    819
SQL_APPLICATION_CODEPAGE: 1208  # UTF-8
C3.E9

您应该查询SQL_APPLICATION_CODEPAGE,或者确保使用已知的代码页。

相关问题