在数据库(perl)中写入时出现编码问题

nlejzf6q  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(369)

在perlv5.10.1中,我尝试读取文件并将字符串存储在数据库中。当字符串包含重音和外来字符时会出现问题。
在centos 6上,“locale”命令指示:lang=en\u us.utf-8
我的数据库是mysql,我正在写的字段是varchar(64)utf8\u unicode\u ci。
我通过putty控制台运行我的测试,设置为window>translation>remotecharacterset:utf8,虽然打印的字符是乱码,但这不是主要问题。
这是我的剧本:


# !/usr/bin/perl

use warnings;
use strict;
use utf8;
use open ':std', ':encoding(UTF-8)';
use DBI;

# A test string

my $test = 'é';
print "- 1: $test\n";

# First string in my file, containing a single 'é'

my $string = '';
open(my $fh, '<', 'myFile');
while(my $line = <$fh>) {
  chomp $line;
  $string = $line;
  last;
}
close $fh;
print "- 2: $string\n";

# Writing test string and first string in DB

my $dbistring = 'DBI:mysql:database=xxxx;host=xxxx;port=xxxx';
my $socket = DBI->connect($dbistring, 'xxxx', 'xxxx');
my $cmd = 'UPDATE Strings SET string="'.$test.'" WHERE id=1';
my $request = $socket->prepare($cmd);
$request->execute();
$cmd = 'UPDATE Strings SET string="'.$string.'" WHERE id=2';
$request = $socket->prepare($cmd);
$request->execute();

照片如下:
1: ▒
2: ▒
在my db表中,字段的结尾为:
id 1:ã©
id 2:ã©
为了避免perl字符串串联可能产生的双重编码,我尝试了:

$string = Encode::decode('UTF-8', $string);

给我同样的结果。如果我在打开文件时指示“<:编码(utf-8)”,则相同。
我很困惑,因为我的进程链似乎都设置在utf8中。非常感谢您的建议。

huwehgph

huwehgph1#

perl中的几个问题

use utf8;
use open ':std', ':encoding(UTF-8)';

my $dbh = DBI->connect("dbi:mysql:".$dsn, $user, $password, {
       PrintError => 0,
       RaiseError => 1,
       mysql_enable_utf8 => 1,  # Switch to UTF-8 for communication and decode.
});

# or {mysql_enable_utf8mb4 => 1} if using utf8mb4

乱码
用utf-8字符查看“mojibake”故障;我所看到的并不是我为检查其他问题而存储的内容。

8nuwlpux

8nuwlpux2#

这篇有价值的文章提供了解决方案:
dbi与db通信时出现问题,连接时添加mysql\u enable\u utf8标志解决:

DBI->connect($dbistring, 'xxxx', 'xxxx', { mysql_enable_utf8 => 1 });

相关问题