PHP - SQL 包含 unicode 的查询由于某种原因返回 NULL
PHP - SQL query containing unicode is returning NULL for some reason
我正在尝试 运行 这个查询:
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];
}
我的mySQLtable是这样制作的:
Word | Trans
-------------
Flower| Çiçek
-------------
Çiçek | Flower
当我传给gettranslation
函数的$word
为Flower
时,结果为Çiçek
。然而,当我反过来时,结果是 NULL
.
此外,如果我对它执行 var_dump
,我什么也得不到。甚至不是一个空数组。
奇怪的是,当我 运行 在 PHPmyAdmin 中执行相同的查询时 运行 没问题。
帮忙?
据我所知,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];
}
$result=mysqli_query($this->conn, "set character_set_results='utf8'");
这只会影响用于返回字符串的字符集,不会影响传入查询的字符集。因此,您的查询被解释为好像是 ISO-8859-1 编码的:LIKE 'Ãiçek'
。这与 table.
中的任何数据都不匹配
而是为整个连接设置字符集:
$this->conn->set_charset('utf-8');
最好在连接时执行一次,而不是在每次查询时执行。
(Never use SET NAMES
. 这设置了 MySQL 的连接编码而不让 PHP 的 mysqli 知道编码有改变了,所以当涉及 mysqli_real_escape_string
一些内容时,它会使用错误的编码。如果有问题的编码是东亚多字节编码,这意味着你会得到一个 SQL 注入孔。)
我正在尝试 运行 这个查询:
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];
}
我的mySQLtable是这样制作的:
Word | Trans
-------------
Flower| Çiçek
-------------
Çiçek | Flower
当我传给gettranslation
函数的$word
为Flower
时,结果为Çiçek
。然而,当我反过来时,结果是 NULL
.
此外,如果我对它执行 var_dump
,我什么也得不到。甚至不是一个空数组。
奇怪的是,当我 运行 在 PHPmyAdmin 中执行相同的查询时 运行 没问题。
帮忙?
据我所知,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];
}
$result=mysqli_query($this->conn, "set character_set_results='utf8'");
这只会影响用于返回字符串的字符集,不会影响传入查询的字符集。因此,您的查询被解释为好像是 ISO-8859-1 编码的:LIKE 'Ãiçek'
。这与 table.
而是为整个连接设置字符集:
$this->conn->set_charset('utf-8');
最好在连接时执行一次,而不是在每次查询时执行。
(Never use SET NAMES
. 这设置了 MySQL 的连接编码而不让 PHP 的 mysqli 知道编码有改变了,所以当涉及 mysqli_real_escape_string
一些内容时,它会使用错误的编码。如果有问题的编码是东亚多字节编码,这意味着你会得到一个 SQL 注入孔。)