MySQLテーブルにURLを保存する必要があります。長さが不明なURLを保持するフィールドを定義するためのベストプラクティスは何ですか?
TEXT
タイプをそのままにして、以下のすべての回答を読み飛ばしてください。結局、それが彼らのほとんどが示唆していることです。:)もちろん、インデックス付けや一意性が必要な場合はVARCHAR
、簡単TEXT
にインデックス付けできないため、に進んでください。
MySQLテーブルにURLを保存する必要があります。長さが不明なURLを保持するフィールドを定義するためのベストプラクティスは何ですか?
TEXT
タイプをそのままにして、以下のすべての回答を読み飛ばしてください。結局、それが彼らのほとんどが示唆していることです。:)もちろん、インデックス付けや一意性が必要な場合はVARCHAR
、簡単TEXT
にインデックス付けできないため、に進んでください。
回答:
http://dev.mysql.com/doc/refman/5.0/en/char.html
VARCHAR列の値は可変長文字列です。長さは、MySQL 5.0.3より前は0〜255、5.0.3以降のバージョンでは0〜65,535の値として指定できます。MySQL 5.0.3以降のVARCHARの有効な最大長は、最大行サイズ(すべての列で共有される65,535バイト)と使用される文字セットの影響を受けます。だから... ...
<MySQLの5.0.3利用TEXT
または
> =のMySQL 5.0.3使用VARCHAR(2083)
VARCHAR(2083)
、を使用してくださいTEXT
。
VARCHAR(512)
(または同様の)で十分です。ただし、問題のURLの最大長がわからないので、直接に移動する場合がありTEXT
ます。もちろん、これの危険性は、CLOB
sがのような単純な文字列データ型よりもはるかに遅いため、効率が低下することVARCHAR
です。
varchar(max)
SQLServer2005
varchar(65535)
MySQL 5.0.3以降の場合
これにより、必要に応じてストレージが割り当てられ、パフォーマンスには影響しません。
max
、必要に応じてVARCHARサイズを増やすための魔法のANSI SQL指定子ですか、それとも単なる例としてメタ変数ですか?
URLが使用される頻度と、実際に長さをバインド解除する必要があるかどうかに基づいて、TEXT列またはVARCHAR列を選択する必要があります。
以下の場合、micahwittmanが提案するように、maxlength> = 2,083のVARCHARを使用します。
次の場合はTEXTを使用します。
VARCHARをASCII文字エンコードで使用する必要があります。URLはパーセントでエンコードされており、国際ドメイン名はpunycodeを使用しているため、ASCIIで保存できます。これはUTF8よりもはるかに少ないスペースを使用します。
VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
これは実際にはユースケースに依存しますが(以下を参照)、TEXT
パフォーマンスの問題があり、VARCHAR
ほとんどの場合、やり過ぎのような巨大なサウンドを格納します。
私のアプローチ:寛大ですが、あまりVARCHAR
長くないなど、長VARCHAR(500)
すぎないようにし、より大きなURLが必要なユーザーには、などの短縮URLを使用するように勧めますsafe.mn
。
Twitterのアプローチ:本当に素晴らしいUXの場合、長すぎるURLの自動URL短縮機能を提供し、リンクの「表示バージョン」を、末尾に省略記号が付いたURLのスニペットとして保存します。(例:http://stackoverflow.com/q/219569/1235702
として表示されstackoverflow.com/q/21956...
、短縮URLにリンクしますhttp://ex.ampl/e1234
)
注意と警告
ほとんどのブラウザでは、非常に大量のデータをURLに入れることができるため、多くのものが非常に大きなURLを作成することになるため、URLのドメイン部分以外のことについて話す場合は、TEXT列を使用する必要があります。VARCHAR / CHARには制限があります。
他のブラウザについては知りませんが、IE7はHTTP GET操作に対して2083文字の制限があります。他のブラウザに下限がない限り、2083文字以上の文字が必要な理由はわかりません。
(サイズの点で)varchar(max)を使用することをお勧めしvarchar (65535)
ます。これにより、より大きなWebアドレスが格納され、スペースも節約されます。
max指定子は、varchar、nvarchar、およびvarbinaryデータ型のストレージ機能を拡張します。varchar(max)、nvarchar(max)、およびvarbinary(max)は、まとめて大きな値のデータ型と呼ばれます。大きな値のデータ型を使用して、最大2 ^ 31-1バイトのデータを格納できます。
大きな値のデータ型の使用に関するTechNetのこの記事を参照してください。
varchar (max)
SQLServer構文であり、MySQLには適していません(元の質問と同様)。さらにvarchar (65535)
、65535はmysqlの行内のASCII文字の最大数であるため、他のフィールドや文字セットにも依存するため、これは意味を持ちません。