我想在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 不区分大小写。