20
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Mysqlでユニーク制約をつけたvarcharは767byteまでしか入らない話

Posted at

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文字でも良いが、本格的に対応するのには別の方法をとった方が良さそう。

だが、どうすれば良いかわからないので教えて偉いヒト・・・・

20
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?