【问题标题】:Correct syntax of using MySQL LIKE?使用 MySQL LIKE 的正确语法?
【发布时间】:2012-07-31 02:41:00
【问题描述】:

我有一堆 LIKE 语句的查询。我想优化/解释运行良好的查询。但是,如果我复制这个:

 SELECT a.*, p.ek, p.vk, p.waehrung, p.onlinepreis
     FROM arts a USE INDEX (i_aktiv, i_iln, i_marke )
         LEFT JOIN pls p ON 
           p.iln = a.iln  
         LEFT JOIN fbs zu 
           ON a.farbe = zu.farbe 
           WHERE a.aktiv = "ja"
           AND (
       a.artikelbezeichnung LIKE ? 
    OR a.artikelbezeichnung_lang LIKE ? 
            OR (   a.farbe LIKE '%decke%'
                 OR zu.systemfarbe LIKE '%decke%'
                 OR zu.systemfarbe_en LIKE '%decke%' 
                 )
                                ) 
            )
         ...

我想添加'%decke%'作为参数,但如果我使用%%,MySQL会不断抛出错误。

知道我做错了什么吗?

我得到的错误是:

您的 SQL 语法有错误....检查附近... %'%'decke%' 在 OR (a.farbe LIKE '%decke%' ...

【问题讨论】:

  • 错误是……究竟是什么?
  • 我已经使用了这种精确的格式,它对我来说效果很好。
  • ...嗯...现在可以了。我不明白为什么,可能是因为现在是凌晨 3 点,我有点失明......

标签: mysql select sql-like


【解决方案1】:

对于通配符 LIKE 比较,您必须伪造它:

WHERE somefield LIKE CONCAT('%', ?, '%')

通配符“喜欢”是参数化查询在他们脸上平淡无奇的一个地方。

【讨论】:

  • 有什么证据吗?我无法相信或谷歌它。为什么参数不能是%foo% 字符串?
  • 如果你愿意,你可以传入%foo%,这会起作用,但是你必须提前调整那个参数的值。你不能有LIKE '%?%'。这绝对行不通。
  • @Marc:IMO,这不是参数化查询与LIKE or 通配符不兼容的问题。只是每个绑定变量都是一个独立的标记,你不能简单地将它放在这样的带引号的字符串中。这类似于说在 LIKEs 时 UDF 倒在了他们的脸上,因为你不能这样做 LIKE '%MyFoo()%'
  • @Marc B:我同意 Lèse majesté - 这不是参数或 LIKE 和通配符的问题。你的回答会让新手感到困惑,他们只会知道这个案例有一些“魔法”,而这个案例并没有什么特别之处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多