mysql -- 5.0.51b DBI -- 1.52 DBD::mysql -- 4.007 #### #!/usr/bin/perl use strict; use warnings; use DBI; use Encode; binmode STDOUT, ":utf8"; #my $DSN = "DBI:mysql:database=test;host=localhost;mysql_enable_utf8=1"; # fn.1 my $DSN = "DBI:mysql:database=test;host=localhost"; my $dbh = DBI->connect( $DSN, "", "" ); my @cols = qw/country city pronunciation/; my $create_table = "create table test_utf8 (". join( ',', map { "$_ varchar(50)" } @cols ) . ")"; $dbh->do( "drop table if exists test_utf8" ); $dbh->do( "$create_table default character set=utf8" ); $dbh->do( "set names utf8" ); # fn.2 my @src_data = ( "Germany", "K\xf6ln", "k\x{0153}ln" ); print "Sending to db: @src_data\n"; #my @tst_data = @src_data; # fn.3 my @tst_data = map { encode( 'utf8', $_ ) } @src_data; my $sth = $dbh->prepare( "insert into test_utf8 (". join( ',', @cols ). ") values (?,?,?)" ); $sth->execute( @tst_data ); my ( @db_data ) = $dbh->selectrow_array( "select ".join( ',', @cols ). " from test_utf8" ); $_ = decode( 'utf8', $_ ) for ( @db_data ); # fn.4 print "Fetch from db: @db_data\n"; my $diff = 0; for ( 0 .. $#db_data ) { $diff++ if ( $db_data[$_] ne $src_data[$_] ); } print "So that's bad\n" if $diff;