PHP - 包含unicode的SQL查询由于某种原因返回NULL

时间:2015-06-12 19:43:54

标签: php mysql unicode null

我正在尝试运行此查询:

SELECT trans FROM `dictionary` WHERE `word` LIKE 'Çiçek'
像这样(相关代码):

function gettranslation($word){
    return $this->query("SELECT trans FROM `dictionary` WHERE `word` LIKE '$word'");
}
function query($query){
    $result=mysqli_query($this->conn, "set character_set_results='utf8'");
    $result=mysqli_query($this->conn, $query);
    return $row = mysqli_fetch_row($result)[0];
}

我的mySQL表是这样的:

Word  | Trans
-------------
Flower| Çiçek
-------------
Çiçek | Flower

$word我传递给gettranslation函数Flower时,结果为Çiçek。但是当我反过来时,结果是NULL

如果我对它进行var_dump,我什么也得不到。甚至不是一个空数组。

奇怪的是,当我在PHPmyAdmin中运行相同的查询时,运行正常。

帮助?

2 个答案:

答案 0 :(得分:2)

据我记忆,mysqli_query($con, "SET NAMES 'utf8'");是必需的,如下所示:

function gettranslation($word){
    return $this->query("SELECT trans FROM `dictionary` WHERE `word` LIKE '$word'");
}
function query($query){
    //$result=mysqli_query($this->conn, "set character_set_results='utf8'");
    mysqli_query($con, "SET NAMES 'utf8'");
    $result=mysqli_query($this->conn, $query);
    return $row = mysqli_fetch_row($result)[0];
}

答案 1 :(得分:0)

$result=mysqli_query($this->conn, "set character_set_results='utf8'");

这仅影响用于返回字符串的字符集,而不影响传入查询的字符集。因此,您的查询被解释为ISO-8859-1编码:LIKE 'Ãiçek'。这与表中的任何数据都不匹配。

相反,请为整个连接设置字符集:

$this->conn->set_charset('utf-8');

最好在连接时执行此操作,而不是每次查询。

从不使用SET NAMES这设置了MySQL的连接编码,而不让PHP的mysqli知道编码已经改变,所以当谈到mysqli_real_escape_string一些内容时将使用错误的编码。如果有问题的编码是东亚多字节编码,这意味着你得到一个SQL注入漏洞。)