5

我想SELECT ... LIKE在 SQLite 中运行一个区分大小写的查询。但我只希望这一个查询区分大小写,仅此而已。

我知道有

PRAGMA case_sensitive_like = 布尔值;

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

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

示例:我希望查询“FuN”以匹配“blah FuN blah”,但不匹配“foo fun bar”。

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

我可能可以将其打开,然后在查询后关闭,但我可以担心可能产生的影响(效率等)。有没有害处?

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

(这是在 Windows Server 2008 下)

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

4

6 回答 6

7

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

PRAGMA case_sensitive_like = true/false;

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

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

于 2012-05-22T10:57:44.420 回答
2

尝试:

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

*和之间没有空格OPS

于 2012-05-23T21:15:17.417 回答
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);
于 2012-05-20T11:02:45.833 回答
0

你可以尝试这样的事情:

从 YOUR_TABLE 中选择 YOUR_COLUMN WHERE YOUR_COLUMN COLLATE latin1_general_cs LIKE '%YOUR_VALUE%'

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

更新

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

参考:http ://www.sqlite.org/datatype3.html#collat​​ion

于 2012-05-21T18:11:48.630 回答
-1

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

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 没有公开这一点。

于 2012-05-17T18:40:53.677 回答
-2
SELECT * FROM table WHERe field LIKE '%search_term%'

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

于 2013-10-13T08:27:35.990 回答