2013-11-24 30 views
0

是否有可能使以下查询字符串不区分大小写?制作Mysql查询案例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。当我从命令行运行查询它的作品,但是当我通过浏览器执行它时,会引发以下错误。

说明:失败查询:整理 'utf8_general_ci' 是无效的字符集 'latin1的' 在

该表以UTF-8编码的utf8_general_ci的整理。我怎样才能确保“小”的查询匹配小,小或小?

+0

表的编码/整理不一定等于任何给定列的编码/整理。检查你的列是否确实是utf8。 – Mchl

+0

该列的编码是UTF-8 Unicode(utf8),排序规则是utf8_general_ci – user2355051

+0

看来这与LENGTH和REPLACE函数有关系吗?那可能吗? – user2355051

回答

0

看起来好像第二个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条件导致了问题以及整理的设置。

1

使用strtolower()或类似的标准化您的$term变量,然后将其添加到您的查询。

+0

马尔科姆,表中的匹配可以是'小'或'小',如果用户键入'小'或'小'或'小'等,它应该仍然返回结果。没有办法知道表中的数据是什么样子,因为这是一个LONGTEXT字段。 – user2355051