【发布时间】:2017-04-16 06:34:52
【问题描述】:
我错过了这个声明,我最终在数据库中得到了有趣的字符:
mysql_enable_utf8 flag documentation
另外,打开这个标志告诉 MySQL 传入的数据 应被视为 UTF-8。这只有在作为一部分使用时才会生效 对 connect() 的调用。如果您在连接后打开标志, 您将需要发出命令 SET NAMES utf8 以获得相同的 效果。
这是部分代码:
use strict;
use utf8;
use open qw/:std :utf8/;
use DBI;
my $dbh = DBI->connect("...", $user, $pass) or die_report($@);
my $query;
$dbh->{'mysql_enable_utf8'} = 1; #this caused the problem, because it was added after the connect() statement.
$dbh->prepare("CREATE TABLE `$database`.`$table` (`id` INT(8) UNSIGNED NOT NULL AUTO_INCREMENT `response` MEDIUMTEXT) ENGINE = MYISAM DEFAULT CHARSET=utf8 COLLATE utf8_general_ci")->execute or die($@);
my $ua = LWP::UserAgent->new;
$response = $ua->get('http://example.com')->decoded_content;
$query = $dbh->prepare("INSERT INTO `$mysql_database`.`$mysql_table` (`id`, `response`) VALUES (?, ?)");
$query->execute($id, $response);
我需要了解$response 插入mysql 时会发生什么以及如何恢复损坏。
它会被双重编码吗?我可以用聪明的方式解决它吗?
【问题讨论】:
-
提示:
"`$database`.`$table`"应该是$dbh->quote_identifier($database, $table)。 -
请提供
HEX(`response`)的损坏数据。 -
@ikegami,我认为原始表“中毒”,这就是我得到这个的原因。也许我写的某些包没有
use utf8或类似的东西,因为这就是我所拥有的:在表 ALTER 之前: 条目 1: Szabóné537A6162C383C2B30000006EC383C2A9000000条目 2: Szabóné537A6162C3B36EC3A9在表 ALTER 之后: 条目 1: Szabóné537A6162C3B30000006EC3A9000000条目 2: Szab537A6162 -
请问那些NUL是从哪里来的?这不仅仅是一个糟糕的
mysql_enable_utf8标志 -
你是说你有一行包含
537A6162C383C2B30000006EC383C2A9000000和一行包含537A6162C3B36EC3A9并且两者都应该是Szabóné?如果是这样,则并非所有行都已损坏。537A6162C3B36EC3A9是你应该拥有的。
标签: mysql perl encoding utf-8 character-encoding