代码是用Perl编写的。我有例程
sub get_name {
my ($self, $user_name) = @_;
my $sql ='SELECT user_code FROM user_table WHERE user_name=?';
my @params = ($user_name);
my $result = $self->{dbObj}->executeSelectSql ($sql, @params);
return $result;
}
$user_name
的值是
"\x{e5}\x{b0}\x{8f}\x{e3}\x{80}\x{80}\x{e7}\x{ac}\x{b9}\x{e3}\x{80}\x{80}\x{e3}\x{80}\x{80}\x{e5}\x{85}\x{ac}\x{e3}\x{80}\x{80}\x{e4}\x{b9}\x{9f}"
UTF8=1
使用
获得use Data::Dumper;
local $Data::Dumper::Useqq = 1;
warn(Dumper($user_name));
warn(utf8::is_utf8($user_name) ? "UTF8=1" : "UTF8=0");
这是查询:
SELECT user_code FROM user_table WHERE user_name= "小 笹 公 也";
在MySQL中执行时,它可以正常工作并检索如下记录:
+-----------+
| user_code |
+-----------+
| 10 |
+-----------+
即使我在查询中对user_name的值进行了硬编码,它也会检索记录。
但是在从包含参数的perl脚本执行它之后,$result
始终为空。
我在StackOverflow上使用过set names utf8
和所有可能的类似问题的解决方案,但都没有奏效。需要帮忙。 !
答案 0 :(得分:0)
DBI和/或DBD :: mysql是错误的,因为它取决于标量的内部存储格式来确定它的值。
如果使用UTF8 = 0格式存储字符串,则DBD :: mysql需要UTF-8(编码文本)。
如果使用UTF8 = 1格式存储字符串,则DBD :: mysql需要Unicode代码点(解码文本)。
你有一个UTF8 = 1格式的UTF-8字节(编码文本)字符串(这很不寻常,可能表示代码中的错误)。
更好的选择是提供解码文本(因为你应该已经有了!)
use Encode qw( decode_utf8 );
my $text_decoded = decode_utf8($text_utf8);
decode_utf8
将始终返回UTF8 = 1格式的字符串,因此效果很好:)
您将获得的字符串如下:
"\x{5c0f}\x{3000}\x{7b39}\x{3000}\x{3000}\x{516c}\x{3000}\x{4e5f}"