是否可以使以下查询字符串不区分大小写?
SELECT SUBSTR(raw,INSTR(raw,'".$term."') - 50,350) as term,
(LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."',''))) /LENGTH('".$term."') AS occur,name,title
FROM (
SELECT ( LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."','')) ) / LENGTH('".$term."') AS occur, raw, consol.name,title
FROM consol
WHERE LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."',''))>0 AND raw LIKE '%".$term."%' COLLATE utf8_general_ci ORDER BY occur DESC
) t ";
该表的引擎是MyISAM,编码是UTF8。当我从命令行运行查询时,它是有效的,但当我通过浏览器执行它时,它会抛出以下错误。
注意:查询失败:COLLATION'utf8_general_ci'对中的CHARACTER SET'latin1'无效
该表以UTF-8编码,排序规则为utf8_general_ci。如何确保"small"查询与small以及small或small匹配?
在将$term
变量添加到查询之前,请使用strtolower()
或类似工具对其进行规范化。
似乎是第二个select语句中的WHERE子句导致了问题。我改了这个:
WHERE LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."',''))>0 AND raw LIKE '%".$term."%' COLLATE utf8_general_ci ORDER BY occur DESC
对此:
WHERE raw LIKE '%".$term."%' ORDER BY occur DESC
它现在似乎与所有结果相匹配。初始查询从第二个查询中筛选匹配项。似乎是LENGTH(raw) - LENGTH(REPLACE(raw,'".$term."',''))>0
的WHERE条件以及排序规则的设置导致了此问题。