使Mysql查询用例不完整


Make Mysql Query Case Insentive

是否可以使以下查询字符串不区分大小写?

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条件以及排序规则的设置导致了此问题。