laravelのmigrationを使って、下記のようなテーブルをつくろうとしていたが、
何度も、SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
というエラーが出た。
13 public function up()
14 {
15 Schema::create('site_list', function (Blueprint $table) {
16 $table->engine = 'InnoDB';
17
18 $table->increments('id');
19 $table->string('name', 256);
20 $table->string('url', 512)->unique();
21 $table->timestamps();
22 });
23 }
何がダメか
Mysqlでユニーク制約をつけたカラムでは767byteまでしか入れられないようになっている。
私はurlカラムにユニーク制約をつけていたが、512バイトじゃないか!!
と思っていたが、MysqlのVarcharに指定する数値は、バイト
じゃなく文字数
なのである。
つまり、(今回はutf-8を使っていたので)1文字=3byte -> 512文字x3byte = 1536byte。
アウトーーーw
つまり、Varcharカラムにユニーク制約を付けたい場合は、255文字までしか入れれないのでありました。。
ただし、Mysql6以降ではutf8が4byteになるらしいので、255文字でもアウトになる。
その場しのぎ的に対応するのであれば、255文字でも良いが、本格的に対応するのには別の方法をとった方が良さそう。
だが、どうすれば良いかわからないので教えて偉いヒト・・・・