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つの文字列を厳密に(通常は大文字・小文字を区別して)比較し、その辞書順での関係性を示す数値を返します。
=
演算子とは異なり、末尾の空白も区別し、照合順序によっては大文字・小文字の区別をより明確に行うことができます。
厳密な文字列比較が必要な場面で活用できますが、照合順序の挙動やパフォーマンスへの影響を理解した上で使用することが重要です。
コメント