For nonbinary strings (CHAR
,
VARCHAR
,
TEXT
), string searches use the
collation of the comparison operands. For binary strings
(BINARY
,
VARBINARY
,
BLOB
), comparisons use the
numeric values of the bytes in the operands; this means that
for alphabetic characters, comparisons will be case sensitive.
A comparison between a nonbinary string and binary string is treated as a comparison of binary strings.
Simple comparison operations (>=, >, =, <,
<=
, sorting, and grouping) are based on each
character's “sort value.” Characters with the
same sort value are treated as the same character. For
example, if “e
” and
“é
” have the same sort
value in a given collation, they compare as equal.
The default character set and collation are
latin1
and
latin1_swedish_ci
, so nonbinary string
comparisons are case insensitive by default. This means that
if you search with
, you get all column values that start with
col_name
LIKE
'a%'A
or a
. To make this
search case sensitive, make sure that one of the operands has
a case sensitive or binary collation. For example, if you are
comparing a column and a string that both have the
latin1
character set, you can use the
COLLATE
operator to cause either operand to
have the latin1_general_cs
or
latin1_bin
collation:
col_name
COLLATE latin1_general_cs LIKE 'a%'col_name
LIKE 'a%' COLLATE latin1_general_cscol_name
COLLATE latin1_bin LIKE 'a%'col_name
LIKE 'a%' COLLATE latin1_bin
If you want a column always to be treated in case-sensitive
fashion, declare it with a case sensitive or binary collation.
See Section 12.1.14, “CREATE TABLE
Syntax”.
To cause a case-sensitive comparison of nonbinary strings to
be case insensitive, use COLLATE
to name a
case-insensitive collation. The strings in the following
example normally are case sensitive, but
COLLATE
changes the comparison to be case
insensitive:
mysql>SET @s1 = 'MySQL' COLLATE latin1_bin,
->@s2 = 'mysql' COLLATE latin1_bin;
mysql>SELECT @s1 = @s2;
+-----------+ | @s1 = @s2 | +-----------+ | 0 | +-----------+ mysql>SELECT @s1 COLLATE latin1_swedish_ci = @s2;
+-------------------------------------+ | @s1 COLLATE latin1_swedish_ci = @s2 | +-------------------------------------+ | 1 | +-------------------------------------+
A binary string is case sensitive in comparisons. To compare
the string as case insensitive, convert it to a nonbinary
string and use COLLATE
to name a
case-insensitive collation:
mysql>SET @s = BINARY 'MySQL';
mysql>SELECT @s = 'mysql';
+--------------+ | @s = 'mysql' | +--------------+ | 0 | +--------------+ mysql>SELECT CONVERT(@s USING latin1) COLLATE latin1_swedish_ci = 'mysql';
+--------------------------------------------------------------+ | CONVERT(@s USING latin1) COLLATE latin1_swedish_ci = 'mysql' | +--------------------------------------------------------------+ | 1 | +--------------------------------------------------------------+
To determine whether a value will compare as a nonbinary or
binary string, use the
COLLATION()
function. This
example shows that VERSION()
returns a string that has a case-insensitive collation, so
comparisons are case insensitive:
mysql> SELECT COLLATION(VERSION());
+----------------------+
| COLLATION(VERSION()) |
+----------------------+
| utf8_general_ci |
+----------------------+
For binary strings, the collation value is
binary
, so comparisons will be case
sensitive. One context in which you will see
binary
is for compression and encryption
functions, which return binary strings as a general rule:
string:
mysql> SELECT COLLATION(ENCRYPT('x')), COLLATION(SHA1('x'));
+-------------------------+----------------------+
| COLLATION(ENCRYPT('x')) | COLLATION(SHA1('x')) |
+-------------------------+----------------------+
| binary | binary |
+-------------------------+----------------------+