MySQL查询在具有日语字符的WHERE子句中返回空集

时间:2017-07-24 05:11:04

标签: mysql perl

代码是用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和所有可能的类似问题的解决方案,但都没有奏效。需要帮忙。 !

1 个答案:

答案 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}"