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


SQLite: execute case-sensitive LIKE query on a specific query

我想在SQLite中运行一个区分大小写的SELECT ... LIKE查询。但我只希望这一个查询区分大小写,没有别的。

我知道有

PRAGMA case_sensitive_like = 布尔值;

但这似乎改变了所有 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,它仍然像笔记本电脑一样返回结果返回。

为什么不采用简单的使用

PRAGMA case_sensitive_like = true/false;

在每个查询之前和之后,您想区分大小写吗?但请注意 - 区分大小写仅适用于 ASCII 字符,不适用于 Unicode,这使得 SQlite 目前不完全符合 UC。

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

尝试:

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

*OPS之间没有空间。

我认为您可能需要在返回值的 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);

你可以尝试这样的事情:

选择YOUR_COLUMN从YOUR_TABLE哪里YOUR_COLUMN整理latin1_general_cs,如"%YOUR_VALUE%"

不确定列上的排序规则集是什么。我以拉丁语为例。运行查询并在末尾将"cs"更改为"ci"。您应该会看到不同的结果。

更新

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

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

您可以按列执行此操作,而不是按查询执行此操作(可能是您的情况)。为此,请使用 sqlite 排序规则。

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 不会公开这一点。

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

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