###実現したいこと
お世話になっております。
データベースにURLを入れるカラムを設けているのですが、次のエラーへの適切な対処を知りたいです。
宜しくお願いいたします。
###発生している問題・エラーメッセージ
以下エラーで、つまりCREATE
のVARCHAR(500)
が長すぎるためにUNIQUE
が使えないようです。
Specified key was too long; max key length is 767 bytes
###該当のソースコード
こちらのCREATE
で生じるエラーでして、UNIQUE
が原因と思います。
SQL
1CREATE TABLE IF NOT EXISTS urls ( 2 ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 3 post_ID BIGINT(20) UNSIGNED, 4 url VARCHAR(500) NOT NULL UNIQUE, 5 PRIMARY KEY (ID) 6) ENGINE=InnoDB DEFAULT CHARSET=utf8
###試したこと
解決策を2つ考えているのですが、経験不足ゆえ何が適切か見極められません。
例えばUNIQUE
をやめて通常のインデックスにする解決策があるかと思います。
sql
1CREATE TABLE IF NOT EXISTS urls ( 2 ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 3 post_ID BIGINT(20) UNSIGNED, 4 # url VARCHAR(500) NOT NULL, # UNIUQEをやめる 5 INDEX index_urls_01(url), # 代わりにインデックスを貼る 6 PRIMARY KEY (ID) 7) ENGINE=InnoDB DEFAULT CHARSET=utf8
もしくはUNIQUE
のままで、文字コードをlatin1
へと変更する解決策です。
sql
1CREATE TABLE IF NOT EXISTS urls ( 2 ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 3 post_ID BIGINT(20) UNSIGNED, 4 url VARCHAR(500) NOT NULL UNIQUE, 5 PRIMARY KEY (ID) 6) ENGINE=InnoDB DEFAULT CHARSET=latin1 # 文字コードを変更
上記いずれかが適切と思われますか?
もしくは、もっと適切な方法等ございましたらご教示いただけませんでしょうか。
尚、url
カラムは世界にあるすべてが入りえます。
・URLは一般的には最大で約2000文字くらいまで可能なことを考えますと、そもそもUNIQUEは不適切でしょうか?
・それとも、データベースにURLを入れる際は、エンコードされた文字列よりも日本語で入っていた方がいいでしょうか。そうならばlatin1
は不適切でしょうか?
・これらを考えますとインデックスが適切でしょうか。しかしurl
カラムの値は重複しません(同じURLならINSERT
しない)から、UNIQUE
でないと不適切でしょうか?
…のように経験不足で生じうる問題などを想定する力量に欠けておりまして、ご経験豊富な皆様からお力添え頂きたい所存です。
どうぞ宜しくお願い致します。