回答:
デフォルトでは、MySQLは文字列の大文字と小文字を区別しません
これはまったく正しくありません。create database
MySQLを使用する場合は常に、データベース/スキーマに文字セットと照合順序があります。各文字セットにはデフォルトの照合があります。詳細については、こちらをご覧ください。
文字セットのデフォルトの照合latin1
はlatin1_swedish_ci
、たまたま大文字と小文字を区別しません。
たとえば、大文字と小文字を区別する照合を選択できますlatin1_general_cs
(MySQL grammar)。
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 |
+----+-------+
クエリ内から照合順序を変更することもできます。たとえば、大文字と小文字を区別するデータベースでは、次のことができます
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
、およびテキストフィールドの全ての変異体は、ケースの小文字を区別しない比較でください。
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結果; 「BINARY」を入力すると、バイナリ比較が強制されます。