【发布时间】: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
注意将$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');表字符集是 utf8,排序规则是 utf8_general_ci。文本被编码为原始文本。我正在使用以下数据库管理器:SQLyog 和 PHPMyAdmin。
更新 #2: 我附上了屏幕截图,让您看看我正在告诉正确的字符集。
我用$sql->set_charset('utf-8');
更新 #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