mysqli编写的语句无法读取unicode

时间:2013-02-16 08:28:00

标签: php mysqli prepared-statement

假设存储在db表Adams’ Inn

中的America’s Best Inn establishment

我必须在变量Adams’ Inn

中查看America’s Best Inn $EstablishmentName
$stmt = $sql->prepare("SELECT ID FROM `establishment` WHERE Name=? LIMIT 1");
$stmt->bind_param("s",$EstablishmentName);
$stmt->execute();
$stmt->store_result();
print $stmt->num_rows;

问题是我找不到它们。

输出 0

注意$EstablishmentName附上mb_convert_string($EstablishmentName,'HTML-ENTITIES'),否则您最终会收到错误Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

更新:我使用set_charset('utf8')作为客户端;表charset是utf8,排序规则是utf8_general_ci。文本被编码为原始文本。我使用以下数据库管理器:SQLyog和PHPMyAdmin。

更新#2 :我已附上截图供您查看我正在告诉正确的字符集。

screenshot_1

我使用$sql->set_charset('utf-8');

Array
(
    [BrandName] => America's Best Value Inn
    [try1] => 1
)

Array
(
    [BrandName] => Adams' Inn
    [try1] => 0
)

Array
(
    [BrandName] => Ambassador Inn and Suites
    [try1] => 1
)

Array
(
    [BrandName] => Amberley Suite Hotel
    [try1] => 1
)

Array
(
    [BrandName] => America's Best Value Inn
    [try1] => 0
)

更新#3 好的,抱歉。 Name列为latin1_swedish_ci 我更新了专栏Name

ALTER TABLE establishment MODIFY NAME VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci;

这应该在没有mb_convert_string()的情况下正常工作。

3 个答案:

答案 0 :(得分:0)

刚刚放

mysqli_set_charset($db_connection, 'utf8');
数据库连接后

示例

$con=mysqli_connect("localhost", "root", "xxxxx","database");
mysqli_set_charset($con, 'utf8');

答案 1 :(得分:-1)

我唯一能说出来的是我在这里看到很多混淆

  • 预处理语句在这里是无关紧要的,因为它们只实现数据替换的方法,但不会改变数据本身。您将获得相同的结果直接向数据库中添加值。
  • mb_convert_string不会导致非法混合归类错误,因为此错误是由内部内部编码冲突触发的,而不是由数据格式触发的。
  • 没有代码可以证明存储的值等于用于检查的值

假设你可以根据id获得Adams’ Inn America’s Best Inn值,我建议你检索它,然后手动比较。 var_dump()他们。如果你仍然看不到差异 - urlencode()他们首先

答案 2 :(得分:-2)

解决了这个问题:

iconv('windows-1250', 'utf-8', $EstablishmentName);