Firtly, in SQL the %
symbol is a "wildcard operator". When used in a LIKE
statement, it means "0 or more characters". So LIKE 'Hello%'
means any string beginning with Hello
, including just Hello
. While LIKE '%Hello%'
means any string that contains Hello
, either at the beginning, middle, or end.
$wpdb->prepare()
on the other hand uses the %
symbol to support placeholders, with %d
and %s
. It allows you to safely insert a variable into a query.
So the problem is that the %
has two different meanings, which will give you trouble if you try to $wpdb->prepare()
a LIKE
query.
The solution is to 'escape' the %
symbol by using the character twice, like %%
. This tells $wpdb->prepare()
that the %
symbol is a literal %
symbol, and not part of a placeholder. This is how you use the %
symbol in a LIKE
query with a placeholder.
So in your first example:
LIKE '%%%s%%'
If $code
is Hello
, then the resulting SQL statement is:
LIKE '%Hello%'
Because %s
has been substituted with $code
, and the double %%
have been interpreted as %
, leaving us with a valid LIKE
statement for any string that contains Hello
, either at the beginning, middle, or end.
Your other example on the other hand:
LIKE '%s%'
Would not work. Because %s
will be substituted with $code
, but a stray %
is remaining that will appear as a broken placeholder. If you only want to find strings beginning with $code
, you would need to use:
LIKE '%s%%'
Which would give you:
LIKE 'Hello%'