【问题标题】:PHP/Mysql Search - Case sensitivePHP/Mysql 搜索 - 区分大小写
【发布时间】:2011-04-13 03:46:26
【问题描述】:

我正在使用以下 PHP 和 MySql 从表中获取行,

$search_word=$_GET['search_word'];
$search_word_new=mysql_escape_string($search_word);
$search_word_fix=str_replace(" ","%",$search_word_new);
$sql=mysql_query("SELECT * FROM tweets WHERE content LIKE '%$search_word_fix%' ORDER BY votes DESC LIMIT 20");

“内容”字段是一个包含推文的 TEXT 字段。

我遇到的问题是,如果我搜索“Stackoverflow”,我会得到所有包含“Stackoverflow”的结果,但当文本为“stackoverflow”时没有结果。基本上搜索是区分大小写的。

是否可以更改查询或 PHP,以便在搜索“Stackoverflow”时返回大小写结果?

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    强制搜索词和列值的大小写:

    SELECT * FROM tweets WHERE LOWER(content) LIKE LOWER('%$search_word_fix%') ORDER BY votes DESC LIMIT 20
    

    或:

    SELECT * FROM tweets WHERE UPPER(content) LIKE UPPER('%$search_word_fix%') ORDER BY votes DESC LIMIT 20
    

    http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

    【讨论】:

      【解决方案2】:

      你可以试试:

      $search_word_fix=strtolower(str_replace(" ","%",$search_word_new));
      $sql=mysql_query("SELECT * FROM tweets WHERE lower(content) LIKE '%$search_word_fix%' ORDER BY votes DESC LIMIT 20");
      
      • 我添加了strtolower 来制作 $search_word_fix 全部小写。
      • 在 where 子句中我已更改 contentlower(content) 以便 我与小写的比较 content

      您可以按照其他答案中的建议在查询中进行这两项更改。

      【讨论】:

      • 对 PHP 新手来说最简单的解决方案。
      • 最简单!=最好。这不会利用任何可能的索引,并且很可能会更慢。 (那个自负的白痴说,他实际上只是对似乎没有人关心 MySQL 中如此简单的不区分大小写的排序规则感到难过)。
      【解决方案3】:

      “正确”的做法是将其设置为不区分大小写的排序规则:

      CREATE TABLE foo (col1 varchar(24) COLLATE utf8_bin,col2 varchar(24) COLLATE  utf8_general_ci);
      Query OK, 0 rows affected (0.03 sec)
      
      DB 5.1.49-1-log:test  mysql> INSERT INTO foo VALUES ('stackoverflow','stackoverflow');
      Query OK, 1 row affected (0.01 sec)
      
      DB 5.1.49-1-log:test  mysql> SELECT * FROM foo WHERE col1 LIKE 'Stackoverflow';
      Empty set (0.00 sec)
      
      DB 5.1.49-1-log:test  mysql> SELECT * FROM foo WHERE col2 LIKE 'Stackoverflow';
      +---------------+---------------+
      | col1          | col2          |
      +---------------+---------------+
      | stackoverflow | stackoverflow |
      +---------------+---------------+
      1 row in set (0.00 sec)
      
      DB 5.1.49-1-log:test  mysql> SELECT * FROM foo WHERE col1 COLLATE utf8_general_ci LIKE 'Stackoverflow';
      +---------------+---------------+
      | col1          | col2          |
      +---------------+---------------+
      | stackoverflow | stackoverflow |
      +---------------+---------------+
      1 row in set (0.00 sec)
      

      【讨论】:

      • 请勿使用COLLATE 子句,除非您根本无法更改列的排序规则——您无法使用索引。
      【解决方案4】:

      mysql> SELECT * FROM myDb.myTable WHERE username = 'test980'; 一组中的 1 行(0.00 秒)

      mysql> SELECT * FROM myDb.myTable WHERE username = 'TEST980'; 空集(0.00 秒)

      可以通过使用 binary 关键字创建 MySQL 列来区分大小写。我怀疑这是你的问题。您可以将列修改为非二进制或将查询更改为:

      SELECT * FROM myDb.myTable WHERE UCASE(username) = 'TEST980';

      这实际上使字符串比较不区分大小写,尽管 已选择二进制字符集。

      【讨论】:

      • BINARYUCASE 成本很高,因为索引无法使用。
      【解决方案5】:

      一切都是为了在创建 MySql 数据库时选择最佳排序规则。

      • utf8_unicode_ci 如果您想准确地对德语字符集进行排序,但它很慢。
      • utf8_general_ci 是默认创建 MySQL 数据库字符集 utf8 时的标准,它是最快的,但不区分大小写。
      • 经验法则:在 MySQL 上始终使用 utf8_general_ci 并在需要区分大小写时整理 utf8_bin 或在语句中使用 SELECT BINARY。

      【讨论】:

        【解决方案6】:

        将相关列 (content) 的 COLLATION 更改为不区分大小写,例如 utf8mb4_unicode_ci

        在 PHP 中进行大小写折叠成本高且效率低。

        【讨论】:

          【解决方案7】:

          请注意,如果您使用的是另一种语言并且您使用的是“strtolower()”,它不会将特殊字符(非英文字母)转换为小写,这将完成 mb_strtolower($text, 'utf8');

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-09-26
            • 1970-01-01
            • 2013-02-17
            • 1970-01-01
            • 2011-03-31
            • 1970-01-01
            • 2010-10-28
            • 2013-06-15
            相关资源
            最近更新 更多