【问题标题】:mysqli prepared statement cannot read unicodemysqli 准备好的语句无法读取 unicode
【发布时间】:2013-02-16 08:28:00
【问题描述】:

假设Adams’ InnAmerica’s Best Inn存储在db表establishment

我必须在变量$EstablishmentName 中检查Adams’ Inn America’s Best Inn

$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

注意$EstablishmentNamemb_convert_string($EstablishmentName,'HTML-ENTITIES') 括起来,否则您将得到错误Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

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

更新 #2: 我附上了屏幕截图,让您看看我正在告诉正确的字符集。

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

大批 ( [品牌名称] => 美国最佳价值旅馆 [尝试1] => 1 ) 大批 ( [品牌名称] => 亚当斯旅馆 [尝试1] => 0 ) 大批 ( [品牌名称] => 大使套房酒店 [尝试1] => 1 ) 大批 ( [品牌名称] => 安伯利套房酒店 [尝试1] => 1 ) 大批 ( [品牌名称] => 美国最佳价值旅馆 [尝试1] => 0 )

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

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

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

【问题讨论】:

  • 那么您的数据库连接的字符集是?你的表的字符集?你提到 htmlentities ......那么 是否存储为编码实体?原始文本?如果没有更多详细信息,您的问题将无法回答。
  • 两个文本都被编码为原始文本。我为客户端设置了 set_charset('utf8'),表字符集是 utf8,排序规则是 utf8_general_ci。
  • @MarcB 你对为什么会发生这种情况有任何想法吗?

标签: php mysqli prepared-statement


【解决方案1】:

随便放

mysqli_set_charset($db_connection, 'utf8');

在你的数据库连接之后。

示例

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

【讨论】:

    【解决方案2】:

    我唯一能说的是我在这里看到了很多困惑

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

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

    【讨论】:

    • 我已经更新了这个问题。列名设置为latin1_swedish_ci,我修复了它,但仍然有问题。
    【解决方案3】:

    这解决了问题:

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

    【讨论】:

      猜你喜欢
      • 2012-05-15
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 2014-05-18
      • 2011-03-07
      • 2014-06-11
      相关资源
      最近更新 更多