MySQLのSTRCMP関数は、2つの文字列を大文字・小文字を区別して比較し、その結果を数値で返すために使用されます。
これは、特定の文字列が完全に一致するかどうかを確認したり、文字列の辞書順での前後関係を判断したりする際に役立ちます。
STRCMP関数は、特にバイナリ文字列や、厳密な比較が必要な場面でその真価を発揮します。
この記事では、STRCMP関数の基本的な使い方、戻り値の意味、NULL値の扱い、他の比較方法との違い、そして使用する際の注意点について解説します。
STRCMP関数の基本的な構文
STRCMP関数の基本的な構文は以下の通りです。
STRCMP(string1, string2)
string1: 比較対象となる最初の文字列。string2: 比較対象となる2番目の文字列。
この関数は、string1とstring2を比較し、結果を数値で返します。
STRCMP関数の戻り値
STRCMP 関数の戻り値は以下の3つのいずれかになります。
0:string1とstring2が完全に等しい場合(大文字・小文字も区別される)。-1:string1がstring2より辞書順で前に来る場合。1:string1がstring2より辞書順で後に来る場合。
STRCMP関数の実行例
SELECT STRCMP('apple', 'apple'); -- 結果: 0 (完全に一致)
SELECT STRCMP('apple', 'Apple'); -- 結果: 1 ('a' < 'A' ではないので、小文字の方が後と判断されることもある。実際の挙動は文字セット/照合順序による)
SELECT STRCMP('Apple', 'apple'); -- 結果: -1
SELECT STRCMP('apple', 'banana'); -- 結果: -1 ('apple' は 'banana' より前)
SELECT STRCMP('banana', 'apple'); -- 結果: 1 ('banana' は 'apple' より後)
SELECT STRCMP('Hello', 'hello'); -- 結果: 1 (H > h と判断される場合。これも照合順序による)
SELECT STRCMP('hello', 'Hello'); -- 結果: -1
SELECT STRCMP('123', '12'); -- 結果: 1 (長さも比較対象)
SELECT STRCMP('test', 'test '); -- 結果: -1 (末尾の空白も比較対象)
重要:
STRCMP の比較挙動は、使用しているカラムやデータベース、または接続の文字セットと照合順序(Collation)に強く依存します。
特に大文字・小文字の比較結果は、照合順序が _ci (case-insensitive) の場合は 0 を返すことがありますが、_cs (case-sensitive) や _bin (binary) の場合は異なる結果を返します。
厳密な大文字・小文字区別の比較には BINARY キーワードを併用するか、_bin 照合順序のカラムを使用することが最も確実です。
STRCMP関数とNULL値の扱い
STRCMP 関数に NULL 値が渡された場合、結果は常に NULL になります。
SELECT STRCMP('apple', NULL); -- 結果: NULL
SELECT STRCMP(NULL, 'apple'); -- 結果: NULL
SELECT STRCMP(NULL, NULL); -- 結果: NULL
STRCMP関数と=演算子との違い
比較の挙動の違い
文字列の比較には = 演算子もよく使われますが、STRCMP 関数とは重要な違いがあります。
=演算子:- 通常、大文字・小文字を区別しない(ケースインセンシティブ)比較を行います(ただし、カラムの照合順序が
_csや_binの場合は区別する)。 - 末尾の空白を無視することがある(
'abc' = 'abc 'がTRUEになることがある)。 - 戻り値は
TRUE(1) またはFALSE(0)。
- 通常、大文字・小文字を区別しない(ケースインセンシティブ)比較を行います(ただし、カラムの照合順序が
STRCMP関数:- 通常、大文字・小文字を区別する(ケースセンシティブ)比較を行います(正確な挙動は照合順序に依存するが、厳密な比較を意図している)。
- 末尾の空白も区別する。
- 戻り値は
0(等しい),-1(前),1(後)。
実行例(照合順序がutf8mb4_unicode_ci の場合)
データベースの照合順序が utf8mb4_unicode_ci (大文字・小文字を区別しない) であると仮定した場合:
SELECT 'Apple' = 'apple'; -- 結果: 1 (TRUE)
SELECT STRCMP('Apple', 'apple'); -- 結果: -1 または 1 (照合順序によるが、異なることを示す)
SELECT 'test' = 'test '; -- 結果: 1 (TRUE)
SELECT STRCMP('test', 'test '); -- 結果: -1 (異なることを示す)
厳密な大文字・小文字区別の比較が必要な場合
STRCMPを使用するか、BINARY キーワードを=演算子と共に使用します。
SELECT BINARY 'Apple' = BINARY 'apple'; -- 結果: 0 (FALSE)
SELECT STRCMP(BINARY 'Apple', BINARY 'apple'); -- 結果: -1 または 1 (異なることを示す)
STRCMP関数を使う際の注意点
- 照合順序の理解:
STRCMPの挙動は、使用しているカラムの文字セットと照合順序によって異なります。特に大文字・小文字の区別を厳密に行いたい場合は、カラムの照合順序が_bin(バイナリ) または_cs(ケースセンシティブ) であることを確認するか、比較する文字列にBINARYキーワードを適用してください。 - パフォーマンス:
WHERE句でSTRCMP関数を使用すると、インデックスが利用されなくなる可能性があるため、大規模なデータセットではパフォーマンスに影響を与えることがあります。厳密な比較を頻繁に行う場合は、適切なインデックス戦略を検討しましょう。 - 戻り値の解釈:
0,-1,1の戻り値の意味を正しく理解し、条件分岐などに利用しましょう。
まとめ
MySQLのSTRCMP関数は、2つの文字列を厳密に(通常は大文字・小文字を区別して)比較し、その辞書順での関係性を示す数値を返します。
= 演算子とは異なり、末尾の空白も区別し、照合順序によっては大文字・小文字の区別をより明確に行うことができます。
厳密な文字列比較が必要な場面で活用できますが、照合順序の挙動やパフォーマンスへの影響を理解した上で使用することが重要です。

コメント