ど素人から毛を生やす。<延>

MySQLは比較法を変更しないと大文字小文字を区別しない話

Web > Other 2020年4月7日(最終更新:3年前)

2020年4月7日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

どもです。

一般的なプログラム言語では、アルファベットの大文字小文字は別の文字として扱われます。

が、MySQLでは同じ文字として扱われます。
そういえば僕も可読性が上がるので、普段から「select」でなく「SELECT」といった書き方をしています。

さて、今回はこの仕様をすっかり忘れていたおかげで嵌ってしまった話です。

キーのみのテーブルを作成し、そこまでの処理はPHPで行います。
INSERTする前にarray_unique()したのでキーの重複エラーの心配もなし!


PHPでは大文字小文字は別文字扱い、MySQLでは同じ文字扱い。
同じ文字列の大文字小文字違いが入ったらゲームオーバーです。

なんてこった。

解決法は二通り。
大文字小文字をMySQL上で区別させるか、PHP側で大文字小文字を区別させないようにするか、です。

後者は単純で、

$array = array_map('strtolower', $array);
$array = array_unique($array);

strtolower()を適用させてからarray_unique()するだけ。
大文字小文字の区別が要らないのであれば、初めから大文字小文字の区別をなくした状態でINSERTすれば良いです。

大文字小文字の区別が必要な場合は、

ALTER TABLE `table_name` MODIFY `column_name` VARCHAR(10) BINARY NOT NULL DEFAULT '' COMMENT 'comment';

カラムの定義にBINARYを加えてやればOKです。※もちろん、MODIFYでなくADDでも可。

BINARYをすると、Collation(照合順序)の比較法が「bin」に変更されます。
これでカラムの文字列はバイナリコード(2進数のコード)で比較されることになり、大文字小文字の区別がされるようになります。
未検証ですが、比較法「cs」に変更でも問題なさそうですね。

この記事は役に立ちましたか?
  • _(:3」∠)_ 面白かった (0)
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)