SQLクエリで大文字と小文字を区別した検索が必要です。ただし、デフォルトでは、MySQLは文字列の大文字と小文字を考慮しません。
SQLクエリで大文字と小文字を区別する検索を行う方法に関するアイデアはありますか?
デフォルトでは、MySQLは文字列の大文字と小文字を区別しません
これはまったく真実ではありません。いつでもcreate database
MySQLでは、データベース/スキーマに文字セットと照合順序があります。各文字セットにはデフォルトの照合があります。 ここを参照 詳細については==。
文字セットのデフォルトの照合latin1
、つまりlatin1_swedish_ci
、大文字と小文字は区別されません。
大文字と小文字を区別する照合を選択できます。たとえば、latin1_general_cs
( MySQL文法 ):
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 |
+----+-------+
MySQLは着実に開発が進んでいるため、使用しているMySQLのバージョンを常に質問する必要があります。
さて、あなたの質問に戻ります:
MySQLの文字列関数では常に大文字と小文字が区別されるため、LOCATE
、POSITION
、または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。 CHAR
、VARCHAR
、およびTEXTフィールドのすべてのバリアントは、大文字と小文字を区別せずに比較します。
b。 CHAR BINARY
、VARCHAR 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%';
これは、文字セットに関係なくMySQLで機能します。
SELECT 'test' REGEXP BINARY 'TEST' AS RESULT;
パッティング'BINARY'
はバイナリ比較を強制します。