【问题标题】:Make Mysql Query Case Insentive使 Mysql 查询不区分大小写
【发布时间】:2013-11-24 21:54:45
【问题描述】:

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

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' in 无效

表格以 UTF-8 编码,排序规则为 utf8_general_ci。如何确保 "small" 查询匹配 small 以及 Small 或 SMALL ?

【问题讨论】:

  • 表的编码/整理不一定等于任何给定列的编码/整理。检查您的列是否确实是 utf8。
  • 列的编码是 UTF-8 Unicode (utf8),排序规则是 utf8_general_ci
  • 这似乎与 LENGTH 和 REPLACE 函数有关?这可能吗?

标签: php mysql case-insensitive


【解决方案1】:

在将$term 变量添加到查询之前,使用strtolower() 或类似方法对其进行规范化。

【讨论】:

  • Malcolm,表中的匹配可以是“小”或“小”,如果用户键入“小”或“小”或“小”等,它仍应返回结果。由于这是一个 LONGTEXT 字段,因此无法知道表中的数据会是什么样子。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 2011-11-29
    • 2018-10-17
    • 2016-11-04
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多