- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 SQL 时,在 WHERE
子句中使用 =
代替 LIKE
有什么好处吗?
如果没有任何特殊的运算符,LIKE
和 =
是相同的,对吧?
最佳答案
LIKE
和 =
是不同的运算符。这里的大多数答案都集中在通配符支持上,这并不是这些运算符之间的唯一区别!
=
是对数字和字符串进行操作的比较运算符。比较字符串时,比较运算符会比较整个字符串。
LIKE
是一个字符串运算符,用于逐个字符进行比较。
让事情变得复杂的是,两个运算符都使用 collation这会对比较结果产生重要影响。
让我们首先举一个例子,其中这些运算符产生明显不同的结果。请允许我引用MySQL手册:
Per the SQL standard, LIKE performs matching on a per-character basis, thus it can produce results different from the = comparison operator:
mysql> SELECT 'ä' LIKE 'ae' COLLATE latin1_german2_ci;
+-----------------------------------------+
| 'ä' LIKE 'ae' COLLATE latin1_german2_ci |
+-----------------------------------------+
| 0 |
+-----------------------------------------+
mysql> SELECT 'ä' = 'ae' COLLATE latin1_german2_ci;
+--------------------------------------+
| 'ä' = 'ae' COLLATE latin1_german2_ci |
+--------------------------------------+
| 1 |
+--------------------------------------+
请注意,MySQL 手册的这一页称为“字符串比较函数”,并且没有讨论 =
,这意味着 =
是严格来说不是字符串比较函数。
=
如何工作?SQL Standard § 8.2描述 =
如何比较字符串:
The comparison of two character strings is determined as follows:
a) If the length in characters of X is not equal to the lengthin characters of Y, then the shorter string is effectivelyreplaced, for the purposes of comparison, with a copy ofitself that has been extended to the length of the longerstring by concatenation on the right of one or more padcharacters, where the pad character is chosen based on CS. IfCS has the NO PAD attribute, then the pad character is animplementation-dependent character different from anycharacter in the character set of X and Y that collates lessthan any string under CS. Otherwise, the pad character is a<space>.
b) The result of the comparison of X and Y is given by thecollating sequence CS.
c) Depending on the collating sequence, two strings maycompare as equal even if they are of different lengths orcontain different sequences of characters. When the operationsMAX, MIN, DISTINCT, references to a grouping column, and theUNION, EXCEPT, and INTERSECT operators refer to characterstrings, the specific value selected by these operations froma set of such equal values is implementation-dependent.
(强调已添加。)
这是什么意思?这意味着在比较字符串时,=
运算符只是当前排序规则的薄包装。排序规则是一个具有各种比较字符串规则的库。这是 a binary collation from MySQL 的示例:
static int my_strnncoll_binary(const CHARSET_INFO *cs __attribute__((unused)),
const uchar *s, size_t slen,
const uchar *t, size_t tlen,
my_bool t_is_prefix)
{
size_t len= MY_MIN(slen,tlen);
int cmp= memcmp(s,t,len);
return cmp ? cmp : (int)((t_is_prefix ? len : slen) - tlen);
}
这种特殊的排序规则恰好是逐字节比较(这就是为什么它被称为“二进制”——它没有赋予字符串任何特殊含义)。其他排序规则可能提供更高级的比较。
例如,这是 UTF-8 collation支持不区分大小写的比较。该代码太长,无法粘贴到此处,但请转到该链接并阅读 my_strnncollsp_utf8mb4()
的正文。此排序规则可以一次处理多个字节,并且可以应用各种转换(例如不区分大小写的比较)。 =
运算符完全从变幻莫测的排序规则中抽象出来。
LIKE
是如何工作的?SQL Standard § 8.5描述 LIKE
如何比较字符串:
The <predicate>
M LIKE P
is true if there exists a partitioning of M into substringssuch that:
i) A substring of M is a sequence of 0 or more contiguous<character representation>s of M and each <characterrepresentation> of M is part of exactly one substring.
ii) If the i-th substring specifier of P is an arbitrarycharacter specifier, the i-th substring of M is any single<character representation>.
iii) If the i-th substring specifier of P is an arbitrary stringspecifier, then the i-th substring of M is any sequence of0 or more <character representation>s.
iv) If the i-th substring specifier of P is neither anarbitrary character specifier nor an arbitrary string specifier,then the i-th substring of M is equal to that substringspecifier according to the collating sequence ofthe <like predicate>, without the appending of <space>characters to M, and has the same length as that substringspecifier.
v) The number of substrings of M is equal to the number ofsubstring specifiers of P.
(强调已添加。)
这实在是太啰嗦了,所以让我们来分解一下。第 ii 项和第 iii 项分别指通配符 _
和 %
。如果 P
不包含任何通配符,则仅适用第 iv 项。这是 OP 提出的兴趣案例。
在本例中,它使用当前排序规则将 M
中的每个“子字符串”(单个字符)与 P
中的每个子字符串进行比较。
底线是,在比较字符串时,=
比较整个字符串,而 LIKE
一次比较一个字符。两个比较都使用当前排序规则。在某些情况下,这种差异会导致不同的结果,如本文第一个示例所示。
您应该使用哪一个?没有人可以告诉你这一点——你需要使用适合你的用例的那个。不要通过切换比较运算符来过早地优化。
关于sql - 等于 (=) 与 LIKE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/543580/
我需要为登录用户生成一个建议列表。基本上是“既然你喜欢这些东西,而其他喜欢这些东西的人也喜欢这些东西,那么你可能也会喜欢这些东西”。 我可能会想出一个不错的算法来产生这样的结果,但在我重新发明轮子之前
此查询中有许多参数是用户可调整的,我希望用户能够创建一些文本文件,使用 sqlite3 db.sqlite ".read query.sql" > result.csv 运行查询,而不是直接将它们编辑
这个问题在这里已经有了答案: MySQL query finding values in a comma separated string (11 个回答) 11 个月前关闭。 我有一个名为 pape
我已将以下内容添加到我的 Blogger 模板中,以便在我的每个 Blogger 帖子上添加一个“赞”按钮: document.write('<iframe src="htt
当我点击“推荐”时,按钮打开的窗口隐藏(不可见)在页脚后面。其实我有截图来准确解释它:http://www.diigo.com/item/image/1q1ia/tw30 当然是XFBML,因为我知道
我在 facebook 上创建了一个页面“全民教育”。在我的网站中,我想提供一个点赞按钮来点赞此页面,而不是url,并且还想显示网站中该页面收到的点赞数以及点赞按钮。我使用了“添加这个”,但它显示了该
这个问题在这里已经有了答案: SQL Server, combining LIKE and IN? (3 个答案) 关闭 6 年前。 我想准备一个查询: SELECT name FROM Emplo
我有一个包含 200 条记录的表,其中 10 条记录的文本包含单词“TAX”。 当我执行时 Select * from tbl1 WHERE [TextCol] LIKE '%TAX%' 然后我正确地
我要执行查询: ---------------------- |name | ---------------------- |data
嗨,我正在为一个我没有设计的数据库编写 MySQL 请求,目前无法真正更改,我有一个问题,我还没有测试过这个,所以它可能按设计工作,但我没有当然。 所以我正在搜索的表只有三列 id、标题和描述,但描述
我已经尽力把这个问题说得很透彻了,所以如果你不耐烦,就跳到最后看看真正的问题是什么...... 我正在努力调整我们其中一个数据库中某些搜索功能的实现方式。为此,我正在向我们的应用程序 API 添加一些
我正在学习 MySQL,我尝试在查询中将“NOT LIKE”与“OR”结合起来,但没有成功。 假设我有一个 table1,其中有一列名为“word”,如下所示: word
Perl-Selenium 还提供了 Test::More 的标准方法,例如 ok()、like()、is() 等,也作为对象方法,例如$sel->like()。 ($sel 是 selenium p
我正在开发这个网站的前端:http://oq.totaleclips.com ,并从以下位置开发它:http://dev-jon.c2mx-hrd.appspot.com 我移动了社交按钮以使 UI
我正在创建一个搜索功能。我的 sql 查询使用 LIKE和 OR LIKE在 where 子句中。我正在搜索的表中的字段之一称为 quantity_types它只存储与在另一个表中找到的值相对应的代码
我有一个名为 platform 的表,其中有一列名为 entityid。 entityid 中的数据应该遵循 n.n.n 格式(其中 n = 1 个或多个数字,第一个数字是站点 ID)。 如果我运行这
所以,我正在练习考试(高中水平),虽然我们从未想过 SQL,但在处理 MS Access 时有必要了解一点. 任务是选择名称与其所属城镇不对应的区域ID。 解决方案中有以下示例: SELECT nam
1.作用与语法描述 作用: 正则表达式是使用指定字符串来描述、匹配一系列符合某个句法规则的字符串。许多程序设计语言都支持利用正则表达式进行字符串操作。MongoDB 使用 $regex 操作符来设
我们有一个网站,其中有文章页面,每个页面上都有一个类似 Facebook 的按钮,并与该文章 URL(URL 编码)相关联。例如,在一些带有 url http://www.site.com/artic
我在理解 SQL 中的 LIKE 和 NOT LIKE 运算符时遇到问题。这是我执行的查询: select serial_number from UNIT U group by serial_numb
我是一名优秀的程序员,十分优秀!