首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >查找MYSQL文本类型列

查找MYSQL文本类型列
EN

Stack Overflow用户
提问于 2018-05-23 06:58:19
回答 2查看 453关注 0票数 16

我的表/模型有TEXT类型的列,当过滤模型本身的记录时,AR where生成正确的SQL并返回正确的结果,这就是我的意思:

代码语言:javascript
复制
MyNamespace::MyValue.where(value: 'Good Quality')

生成以下SQL:

代码语言:javascript
复制
SELECT `my_namespace_my_values`.* 
FROM `my_namespace_my_values` 
WHERE `my_namespace_my_values`.`value` = '\\\"Good Quality\\\"'

举另一个例子,我加入了MyNamespace::MyValue,并在同一个value列上进行过滤,但来自另一个模型(在模型上与my_values有关系)。请看这个(查询#2):

代码语言:javascript
复制
OtherModel.joins(:my_values).where(my_values: { value: 'Good Quality' })

这不会产生正确的查询,这会对value列进行过滤,就好像它是一个字符串列而不是文本,因此会产生不正确的结果,如下所示(只粘贴相关的where):

代码语言:javascript
复制
WHERE my_namespace_my_values`.`value` = 'Good Quality'

现在,我可以通过在AR where中执行类似的操作来克服这一点,这将产生正确的结果,但查询略有不同。这就是我的意思:

代码语言:javascript
复制
OtherModel.joins(:my_values).where('my_values.value LIKE ?, '%Good Quality%')

终于来回答我的问题了。这是什么,它是如何在模型的什么位置生成的(对于文本列类型)?

代码语言:javascript
复制
WHERE `my_namespace_my_values`.`value` = '\\\"Good Quality\\\"'

也许最重要的问题是,使用在性能方面有什么不同:

代码语言:javascript
复制
WHERE `my_namespace_my_values`.`value` = '\\\"Good Quality\\\"'

还有这个:

代码语言:javascript
复制
(my_namespace_my_values.value LIKE '%Good Quality%')

更重要的是,我如何通过连接获得查询(查询#2) where,就像这个

代码语言:javascript
复制
WHERE `my_namespace_my_values`.`value` = '\\\"Good Quality\\\"'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-30 22:54:55

(部分答案--从MySQL方面着手。)

与匹配/不匹配的

情况1:(我不知道多余的反斜杠和引号是从哪里来的。)

代码语言:javascript
复制
WHERE `my_namespace_my_values`.`value` = '\\\"Good Quality\\\"'

\"Good Quality\"               -- matches
Good Quality                   -- does not match
The product has Good Quality.  -- does not match

案例2:(在value中的任意位置查找Good Quality。)

代码语言:javascript
复制
WHERE my_namespace_my_values.value LIKE '%Good Quality%'

\"Good Quality\"               -- matches
Good Quality                   -- matches
The product has Good Quality.  -- matches

案例3:

代码语言:javascript
复制
WHERE `my_namespace_my_values`.`value` = 'Good Quality'

\"Good Quality\"               -- does not match
Good Quality                   -- matches
The product has Good Quality.  -- does not match

性能:

  • 如果value被声明为TEXT,则所有案例都是缓慢的。
  • 如果value未被索引,则所有案例都是缓慢的。
  • 如果<代码>D18是<代码>D19(或更小)且已索引,则案例1和3更快。它可以快速找到一行,而不是检查所有行。

换一种说法:

带有前导通配符(%)的

  • LIKE为slow.
  • Indexing该列对于性能很重要,但不能对TEXT编制索引。
票数 5
EN

Stack Overflow用户

发布于 2018-05-25 21:44:33

'=‘操作正在寻找精确匹配,而LIKE操作的工作方式更像模式匹配,'%’类似于正则表达式中的'*‘。

因此,如果您有以下条目

  1. Good Quality
  2. More Good Quality

只有LIKE才能得到两个结果。

关于转义字符串,我不确定它是在哪里生成的,但看起来像是一些标准化的转义,以使其对SQL有效。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50477550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档