MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで大文字小文字を区別する一意性と、区別しない検索を両立させる方法

MySQLでは、カラムの値に対して「大文字と小文字を区別する一意性(ユニーク制約)」を持たせながら、検索時には「大文字と小文字を区別しない」動作を実現できます。主な方法は次の2つです。

  • VARBINARYデータ型を使う
  • _bin照合順序(COLLATE)を使う

方法1:VARBINARYデータ型を使用する

まずは、VARBINARY型を使ったテーブル作成の例から見ていきましょう。

mysql> create table SearchingDemo2
-> (
-> UserId VARBINARY(128) NOT NULL,
-> UNIQUE KEY index_on_UserId2(UserId)
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Query OK, 0 rows affected, 1 warning (0.99 sec)

ポイントは、UserIdカラムをVARBINARY(128)として定義し、そのカラムにユニークインデックス(index_on_UserId2)を作成している点です。VARBINARY型はデータをバイナリとして扱うため、「ABC」と「abc」は異なる値として認識されます。その結果、一意制約は大文字と小文字を区別して機能します。

方法2:_bin照合順序(COLLATE)を使用する

次に、utf8_bin照合順序を指定したテーブル作成の例です。

mysql> create table SearchingDemo
-> (
-> UserId varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
-> UNIQUE KEY index_on_UserId(UserId)
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Query OK, 0 rows affected, 2 warnings (0.88 sec)

こちらの例では、UserIdカラムはvarchar(128)ですが、カラム単位でCOLLATE utf8_binを指定しています。これにより、このカラムに対する比較や一意制約はバイナリ方式(大文字と小文字を区別する方式)で行われます。

検索時の挙動について

テーブル全体のデフォルト照合順序はutf8_unicode_ci(ci=case insensitive、つまり大文字小文字を区別しない)に設定されているため、WHERE句やLIKEによる検索では大文字と小文字が区別されません。つまり、登録時には「John」と「john」を別々のレコードとして保存できる一方、検索時にはどちらも同じようにヒットさせることができます。

このように、上記のどちらの方法を採用しても、「大文字小文字を区別する一意性」と「大文字小文字を区別しない検索」をMySQLで同時に実現可能です。用途に応じて、バイナリ型を使うか、照合順序だけを変更するかを選択するとよいでしょう。

  1. MySQLで文字列の先頭の特定文字を検索・置換する方法をわかりやすく解説

    MySQLでは、INSERT()関数を使うことで、文字列の先頭にある特定の文字を検索して別の文字列に置き換えることができます。この記事では、実際にテーブルを作成し、先頭が「90」で始まるレコードだけを置き換える手順を順番に解説します。INSERT()関数とはINSERT()関数は、指定した位置から指定した文字数分の文字列を、新しい文字列に置き換える関数です。構文は以下のとおりです。INSERT(対象文字列, 開始位置, 置換する文字数, 挿入する文字列)サンプルテーブルの作成まず、CREATE TABLE文でテーブルを作成します。mysql> create table DemoTable

  2. MySQLのIN()を使った大文字・小文字を区別しないSELECTの実行方法

    MySQLでIN()句を使用しながら、大文字と小文字を区別しないSELECTクエリを実行したい場面はよくあります。本記事では、UPPER()関数を組み合わせることで、大文字・小文字の違いを無視してデータを検索する方法を、実際のSQL例とともにわかりやすく解説します。サンプルテーブルの作成まず、検索対象となるテーブルを作成しましょう。mysql> create table DemoTable1460 -> ( -> Name varchar(20) -> );Query OK, 0 rows affected (0.91 sec)テーブルへのデータ挿入次