2014年11月1日土曜日

MySQLのUNIQUE KEYにおける備忘録3つ


環境はMySQL 5.x、innodbを想定している。
備忘録的に。

1. text型にはUNIQUE KEYをそのまま設定できない

まぁ、可変長型に設定できないのはしょうがない。

※ご指摘頂きました。

blobのため、そのままでは設定できない、というのが正しいです。 代わりにvarcharでも使うことにしよう。
なお、textにインデックスを貼りたいときは、リファレンスにもある通り、こうすればOK
BLOB または TEXT カラムにインデックスを張る場合、インデックスに対して接頭辞長を指定しなければなりません。
例 : CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
接頭辞は、最大 1000 バイト長 (InnoDB テーブルに対しては 767 バイト) まで可能です。接頭辞の最大長はバイトで評価されます。

一方、CREATE TABLE ステートメント内の接頭辞長は文字数として解釈されます。マルチバイトキャラクタセットを使用するカラムに対して接頭辞長を指定するとき、このことを考慮に入れなければいけません。
4.4.2. カラムインデックス



2. keyのlengthは最大で767byteまで

たとえば、UTF-8のとき、3byteで計算すると、varchar(256)はだめで、256*3=768byteになってしまう。(だから、varchar(255)をよく見かけるんだよね)。

あと余談。これ、UTF-8が3byte計算ならいいんだけど、MySQL 6系から今UTF8mb4と呼ばれている4byteUTFが標準のUTF-8になるらしく、そうなった場合、varchar(255)でもあふれることになるんだよね。

UTF8mb4のなにが嬉しいかというと、個人的には絵文字系がそのまま扱えるのが嬉しいかなw

3. NULLはいくらでも入る


nullの定義上、すべてのnullはユニークってことらしいので、nullはいくらでも入る。
カラムにdefault nullを定義するのもOK

2 件のコメント:

  1. 可変長だから設定できないのではないです。blog (big large object) 型の一種なので、インデックスを付けられないのかと思います。
    varchar というのは、可変長文字型と訳しますよ w

    返信削除
  2. ご指摘のとおりです。お恥ずかしいm(_ _)m

    返信削除