MySQLで大文字を含む行を返すための3つのオプションを次に示します。
サンプルデータ
次のデータを含むテーブルがあるとします。
SELECT c1 FROM t1;
結果:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | café | | 1café | | eCafé | | James Bond 007 | | JB 007 | | 007 | | NULL | | | | É | | É 123 | | é | | é 123 | | ø | | Ø | +----------------+
次のメソッドを使用して、大文字を含む行を返すことができます。
オプション1:LOWER()
と比較 文字列
LOWER()
を使用できます 元の値を同等の小文字と比較する関数:
SELECT c1 FROM t1
WHERE CAST(LOWER(c1) AS BINARY) <> CAST(c1 AS BINARY);
結果:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | | É | | É 123 | | Ø | +----------------+
等しくない(<>
を使用する )演算子(代わりに!=
を使用できます <>
の代わりに 必要に応じて)、同等の小文字とは異なる行のみを返します。これを行う理由は、値が同等の小文字と同じである場合、そもそもすでに小文字であるためです(そして、それを返したくないのです)。
デフォルトでは、MySQLは大文字と小文字を区別しない検索を実行するため、CAST()
を使用します 大文字と小文字を区別して検索するために、値をバイナリにキャストする関数。
BINARY
を使用することもできます 値をバイナリにキャストする演算子ですが、この演算子はMySQL 8.0.27で非推奨になり、将来のリリースで削除される可能性があります。
いずれにせよ、これはBINARY
を使用したときのコードのようになります 演算子:
SELECT c1 FROM t1
WHERE BINARY LOWER(c1) <> BINARY c1;
次のようにすることもできます:
SELECT c1 FROM t1
WHERE BINARY(LOWER(c1)) <> BINARY(c1);
MySQL 8.0.27でコードを実行したときに、これらの両方から得られる結果は次のとおりです。
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | | É | | É 123 | | Ø | +----------------+ 8 rows in set, 2 warnings (0.00 sec)
そして、私が警告を表示するとき:
SHOW WARNINGS;
結果:
+---------+------+----------------------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------------------------------------------------------------+ | Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead | | Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead | +---------+------+----------------------------------------------------------------------------------------------+
オプション2:実際のキャラクターと比較する
もう1つのオプションは、REGEXP
を使用することです。 照合する各大文字を明示的に含む正規表現パターンを持つ演算子:
SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' AS BINARY);
結果:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | +----------------+
今回は、前の例よりも少ない行が返されます。 É
のような文字を指定しなかったためです およびØ
、これらの例で返されました。結果にはÉ
が含まれています ただし、その行が返されたのは、実行する他の大文字も含まれているためです。 一致します。
したがって、このオプションを使用する場合は、すべての有効な文字がカバーされていることを確認する必要があります。
オプション3:文字の範囲と比較する
もう1つの方法は、一致させる大文字の範囲を指定することです。
SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[A-Z]' AS BINARY);
結果:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | +----------------+