我的表/模型有TEXT
类型的列,当过滤模型本身的记录时,AR where
生成正确的SQL并返回正确的结果,这就是我的意思:
MyNamespace::MyValue.where(value: 'Good Quality')
生成以下SQL:
SELECT `my_namespace_my_values`.*
FROM `my_namespace_my_values`
WHERE `my_namespace_my_values`.`value` = '\\\"Good Quality\\\"'
举另一个例子,我加入了MyNamespace::MyValue
,并在同一个value
列上进行过滤,但来自另一个模型(在模型上与my_values
有关系)。请看这个(查询#2):
OtherModel.joins(:my_values).where(my_values: { value: 'Good Quality' })
这不会产生正确的查询,这会对value
列进行过滤,就好像它是一个字符串列而不是文本,因此会产生不正确的结果,如下所示(只粘贴相关的where):
WHERE my_namespace_my_values`.`value` = 'Good Quality'
现在,我可以通过在AR where
中执行类似的操作来克服这一点,这将产生正确的结果,但查询略有不同。这就是我的意思:
OtherModel.joins(:my_values).where('my_values.value LIKE ?, '%Good Quality%')
终于来回答我的问题了。这是什么,它是如何在模型的什么位置生成的(对于文本列类型)?
WHERE `my_namespace_my_values`.`value` = '\\\"Good Quality\\\"'
也许最重要的问题是,使用在性能方面有什么不同:
WHERE `my_namespace_my_values`.`value` = '\\\"Good Quality\\\"'
还有这个:
(my_namespace_my_values.value LIKE '%Good Quality%')
更重要的是,我如何通过连接获得查询(查询#2) where,就像这个:
WHERE `my_namespace_my_values`.`value` = '\\\"Good Quality\\\"'
发布于 2018-05-30 22:54:55
(部分答案--从MySQL方面着手。)
与匹配/不匹配的
情况1:(我不知道多余的反斜杠和引号是从哪里来的。)
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
。)
WHERE my_namespace_my_values.value LIKE '%Good Quality%'
\"Good Quality\" -- matches
Good Quality -- matches
The product has Good Quality. -- matches
案例3:
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
未被索引,则所有案例都是缓慢的。换一种说法:
带有前导通配符(%
)的
LIKE
为slow.TEXT
编制索引。发布于 2018-05-25 21:44:33
'=‘操作正在寻找精确匹配,而LIKE操作的工作方式更像模式匹配,'%’类似于正则表达式中的'*‘。
因此,如果您有以下条目
只有LIKE才能得到两个结果。
关于转义字符串,我不确定它是在哪里生成的,但看起来像是一些标准化的转义,以使其对SQL有效。
https://stackoverflow.com/questions/50477550
复制相似问题