web-dev-qa-db-ja.com

WHERE句で大文字と小文字を区別して検索するにはどうすればよいですか?

SQLクエリで大文字と小文字を区別した検索が必要です。ただし、デフォルトでは、MySQLは文字列の大文字と小文字を考慮しません。

SQLクエリで大文字と小文字を区別する検索を行う方法に関するアイデアはありますか?

22
Somnath Muluk

デフォルトでは、MySQLは文字列の大文字と小文字を区別しません

これはまったく真実ではありません。いつでもcreate database MySQLでは、データベース/スキーマに文字セットと照合順序があります。各文字セットにはデフォルトの照合があります。 ここを参照 詳細については==。

文字セットのデフォルトの照合latin1、つまりlatin1_swedish_ci、大文字と小文字は区別されません。

大文字と小文字を区別する照合を選択できます。たとえば、latin1_general_csMySQL文法 ):

CREATE SCHEMA IF NOT EXISTS `myschema` 
DEFAULT CHARACTER SET latin1 
COLLATE latin1_general_cs ;

これは、グループ化や平等などに影響を与えます。例えば、

create table casetable (
  id int primary key, 
  thing varchar(50)
);

select * from casetable;
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

大文字と小文字を区別するデータベースでは、次のようになります。

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| ABC   |        1 |
| aBc   |        1 |
| abC   |        1 |
| abc   |        1 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
+----+-------+

大文字と小文字を区別しないデータベースでは、次のようになります。

select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| abc   |        4 |
+-------+----------+

select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

照合順序 クエリ内から を変更することもできます。たとえば、case-sensitiveデータベースでは、次のことができます

select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+
23
Matt Fenwick

MySQLは着実に開発が進んでいるため、使用しているMySQLのバージョンを常に質問する必要があります。

さて、あなたの質問に戻ります:

MySQLの文字列関数では常に大文字と小文字が区別されるため、LOCATEPOSITION、またはINSTRのいずれの関数も使用できます。

例えば:

SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;

正規表現(RLIKEまたはREGEXP)とのパターンマッチングでは、最新の3.23.4を除くすべてのバージョンのMySQLで常に大文字と小文字が区別されます。

例えば:

SELECT phone FROM user WHERE user_name REGEXP 'term';

通常の比較(=)とSQLパターンマッチング(LIKE)の両方で、動作は関連するフィールドによって異なります。

a。 CHARVARCHAR、およびTEXTフィールドのすべてのバリアントは、大文字と小文字を区別せずに比較します。

b。 CHAR BINARYVARCHAR BINARYおよびBLOBフィールドのすべてのバリアントは、大文字と小文字を区別して比較します。

(a)のフィールドと(b)のフィールドを比較する場合、比較では大文字と小文字が区別されます(大文字と小文字の区別が優先されます)。 MySQLリファレンスマニュアルの「7.2.7文字列型」の章を参照し、ソートと比較に関するステートメントを探してください。

V3.23.0以降では、関係するフィールドのタイプに関係なく、キャスト演算子BINARYを使用して大文字と小文字を区別して比較することもできます。 MySQLリファレンスマニュアルの「7.3.7キャスト演算子」の章を参照してください。

したがって、user_nameのタイプを変更するか、V3.23.xで次のようなことを試してください。

SELECT phone FROM user WHERE BINARY username LIKE '%term%';
15
Turgut

myの状況では、Access 2010を使用していますが、同じ問題がありましたが、解決策は異なります。StrComp()関数を使用して、その戻りをテストしますゼロになる。

StrComp( thing, 'abc', 0) = 0

StrComp()は、最初の引数が「小さい」場合は_-1_を返し、「大きい」場合は_1_、「等しい」場合は_0_を返すため、StrComp()=0の場合、敏感な一致。

herehere または here を参照してください。

1
Martin F

これは、文字セットに関係なくMySQLで機能します。

SELECT 'test' REGEXP BINARY 'TEST' AS RESULT;

パッティング'BINARY'はバイナリ比較を強制します。

1
user2288580