MySQLのSTRCMP関数の使い方!文字列の厳密な比較を行う

MySQL

MySQLのSTRCMP関数は、2つの文字列を大文字・小文字を区別して比較し、その結果を数値で返すために使用されます。

これは、特定の文字列が完全に一致するかどうかを確認したり、文字列の辞書順での前後関係を判断したりする際に役立ちます。
STRCMP関数は、特にバイナリ文字列や、厳密な比較が必要な場面でその真価を発揮します。

この記事では、STRCMP関数の基本的な使い方、戻り値の意味、NULL値の扱い、他の比較方法との違い、そして使用する際の注意点について解説します。

STRCMP関数の基本的な構文

STRCMP関数の基本的な構文は以下の通りです。

STRCMP(string1, string2)
  • string1: 比較対象となる最初の文字列。
  • string2: 比較対象となる2番目の文字列。

この関数は、string1string2を比較し、結果を数値で返します。

STRCMP関数の戻り値

STRCMP 関数の戻り値は以下の3つのいずれかになります。

  • 0: string1string2完全に等しい場合(大文字・小文字も区別される)。
  • -1: string1string2 より辞書順で前に来る場合。
  • 1: string1string2 より辞書順で後に来る場合。

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つの文字列を厳密に(通常は大文字・小文字を区別して)比較し、その辞書順での関係性を示す数値を返します。
= 演算子とは異なり、末尾の空白も区別し、照合順序によっては大文字・小文字の区別をより明確に行うことができます。

厳密な文字列比較が必要な場面で活用できますが、照合順序の挙動やパフォーマンスへの影響を理解した上で使用することが重要です。

コメント