web-dev-qa-db-ja.com

MySQLで大文字と小文字を区別する

MySQLクエリがあります。

SELECT concat_ws(title,description) as concatenated HAVING concatenated LIKE '%SearchTerm%';

そして、私のテーブルはMyISAMでutf8_general_ciでエンコードされています。

検索では大文字と小文字が区別されるようです。

修正方法がわかりません。何が間違っているのか、どうすれば修正できますか?

32
Pmc Machinery

これを試して:

SELECT LOWER(CONCAT_WS(title,description)) AS concatenated 
WHERE concatenated LIKE '%searchterm%'

または(違いを見るため)

SELECT LOWER(CONCAT_WS(title,description)) AS concatenated 
WHERE concatenated LIKE LOWER('%SearchTerm%')
18
Marco

パフォーマンスの面ではるかに優れたソリューション:

SELECT .... FROM .... WHERE `concatenated` LIKE BINARY '%SearchTerm%';

オペランドのいずれかがバイナリ文字列の場合、文字列比較では大文字と小文字が区別されます。

別の方法は、COLLATEを使用することです。

SELECT ....
FROM ....
WHERE `concatenated` like '%SearchTerm%' COLLATE utf8_bin;
41
kolypto

この方法では、検索フィールドを選択する必要はありません。

SELECT table.id 
FROM table
WHERE LOWER(table.aTextField) LIKE LOWER('%SearchAnything%')
5
Malkocoglu

テーブルスキーマに記載されているCHARSETを確認します。

show create table xyz;

CHARSETに基づいて、次を試すことができます。

select name from xyz where name like '%Man%' COLLATE latin1_bin;
select name from xyz where name like '%Man%' COLLATE utf8_bin;

以下は、CHARSET = latin1、MySQLバージョン= 5.6、私のために働いたケースです。

mysql> select installsrc from appuser where installsrc IS NOT NULL and installsrc like 'Promo%' collate latin1_bin limit 1;
+-----------------------+
| installsrc            |
+-----------------------+
| PromoBalance_SMS,null |
+-----------------------+
1 row in set (0.01 sec)

mysql>
mysql> select installsrc from appuser where installsrc IS NOT NULL and installsrc like 'PROMO%' collate latin1_bin limit 1;
+---------------------------+
| installsrc                |
+---------------------------+
| PROMO_SMS_MISSEDCALL,null |
+---------------------------+
1 row in set (0.00 sec)

mysql> select installsrc from appuser where installsrc IS NOT NULL and installsrc like 'PROMO%' limit 1;
+-----------------------+
| installsrc            |
+-----------------------+
| PromoBalance_SMS,null |
+-----------------------+
1 row in set (0.01 sec)
0
minhas23

完了のために、それが役立つ場合:

https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html に記載されているように、デフォルトの文字セットでは、非バイナリ文字列比較ではデフォルトで大文字と小文字が区別されません。

したがって、大文字と小文字を区別しない比較を実行する簡単な方法は、フィールドをCHAR、VARCHAR、またはTEXT型にキャストすることです。

単一のフィールドに対するチェックの例を次に示します。

SELECT * FROM table1 WHERE CAST(`field1` AS CHAR) LIKE '%needle%';
0