【MySQL】文字列検索の大文字・小文字の区別の注意点について
文字列検索において、データ型が「非バイナリ文字列」(CHAR、VARCHAR、VARCHAR)の場合には
比較対象の照合順序が使用されます。
データ型が「バイナリ文字列」(BINARY、VARBINARY、BLOB)の場合の検索には比較対象のバイト値が使用されます。
尚、「非バイナリ文字列」と「バイナリ文字列」の比較では、「バイナリ文字列」の比較で処理されます。
「非バイナリ文字列」の比較で問題が発生する場合は、以下の様な場合です。
仮に以下の様なテーブルが在ったとします。 尚、このテーブルの文字コードは「latin1」になっているとします。
以下の様に一部一致検索(Like)を行います。
普通に考えると「A%」なので大文字「A」を含むものを検索されるのですが、小文字「a」も対象となって結果が表示されています。
文字コード「latin1」の照合順序ではアルファベットの大文字・小文字を区別しないため、この様なことが起こります。
そこで以下の様にSQLを変更してみます。
条件の対象となる「ADDCOL1」の照合順序を COLLATE で強制的に 「latin1」のバイナリ文字列である「latin1_bin」と 指定すると、大文字・小文字が区別されます。
データ型が「バイナリ文字列」(BINARY、VARBINARY、BLOB)の場合の検索には比較対象のバイト値が使用されます。
尚、「非バイナリ文字列」と「バイナリ文字列」の比較では、「バイナリ文字列」の比較で処理されます。
「非バイナリ文字列」の比較で問題が発生する場合は、以下の様な場合です。
仮に以下の様なテーブルが在ったとします。 尚、このテーブルの文字コードは「latin1」になっているとします。
以下の様に一部一致検索(Like)を行います。
普通に考えると「A%」なので大文字「A」を含むものを検索されるのですが、小文字「a」も対象となって結果が表示されています。
文字コード「latin1」の照合順序ではアルファベットの大文字・小文字を区別しないため、この様なことが起こります。
そこで以下の様にSQLを変更してみます。
条件の対象となる「ADDCOL1」の照合順序を COLLATE で強制的に 「latin1」のバイナリ文字列である「latin1_bin」と 指定すると、大文字・小文字が区別されます。
コメント