SQLite:对特定查询执行区分大小写的LIKE查询

时间:2012-05-14 20:40:30

标签: php sqlite pdo case-sensitive

我想在SQLite中运行区分大小写的SELECT ... LIKE查询。但我只希望这一个查询区分大小写,而不是其他任何内容。

我知道有

  

PRAGMA case_sensitive_like = boolean;

但这似乎改变了所有LIKE查询。

如何在单个查询中启用区分大小写的LIKE?

实施例: 我想查询“FuN”以匹配“blah FuN blah”,但不是“foo fun bar”。

(这是在使用PDO的PHP下运行)

我可以在查询之后切换,然后关闭,但我可以关注可能产生的影响(效率等)。有伤害吗?

我没有对数据库的写访问权。

(这是在Windows Server 2008下)

我也试过SELECT id, summary, status FROM Tickets WHERE summary COLLATE BINARY LIKE '%OPS%';但是没有做区分大小写的SELECT,它仍然返回结果返回,如 laptops

6 个答案:

答案 0 :(得分:7)

为什么不采用简单的方式使用

PRAGMA case_sensitive_like = true/false;

在每个查询之前和之后,您希望是个案敏感吗?但要注意 - 大小写敏感只适用于ASCII字符,而不是Unicode,这使得SQlite目前还不完全符合UC标准。

或者,SQlite允许应用程序实现REGEXP运算符,这可能会对www.sqlite.org/lang_expr.html提供帮助。

答案 1 :(得分:2)

尝试:

 SELECT id, summary, status FROM Tickets WHERE summary GLOB \"*OPS*\";

*OPS之间没有空格。

答案 2 :(得分:1)

我认为你可能需要在你的php代码中单独检查返回值,看看它们是否与你的区分大小写的数据一致。

$rs = mysql_query("Select * from tbl where myfield like '%$Value%'");


while($row == mysql_fetch_assoc($rs))
{

     if (strpos($row['myfield'],$Value) !== false)
     {
        $Matches[] = $row;
      }


 }

 print_R($Matches);

答案 3 :(得分:0)

您可以尝试这样的事情:

选择YOUR_COLUMN 来自你的时间 YOUR_COLUMN COLLATE latin1_general_cs LIKE'%YOUR_VALUE%'

不确定列上的归类设置是什么。我选择拉丁语作为例子。运行查询并在结尾处将“cs”更改为“ci”。你会看到不同的结果。

<强>更新

对不起。太快读了这个问题。上面的排序规则适用于mysql。对于SQLLite,您应该能够使用BINARY,它应该为您提供区分大小写的搜索。

参考:http://www.sqlite.org/datatype3.html#collation

答案 4 :(得分:-1)

您可以按列进行操作,而不是按查询(可能是您的情况)。为此,请使用sqlite collations

CREATE TABLE user (name VARCHAR(255) COLLATE NOCASE);

此列上的所有LIKE操作都将不区分大小写。

即使未使用特定排序规则声明列,您也可以COLLATE查询:

SELECT * FROM list WHERE name LIKE '%php%' COLLATE NOCASE

请注意,只有ASCII字符对排序规则不区分大小写。 “A”==“a”,但“Æ”!=“æ”

SQLite允许您使用sqlite_create_collation声明新的排序规则类型,并且它们在PHP端实现排序规则逻辑,但PDO不会公开它。

答案 5 :(得分:-2)

SELECT * FROM table WHERe field LIKE '%search_term%'

在这种形式中,SELECT不区分大小写。