URLに最適なデータベースフィールドタイプ


352

MySQLテーブルにURLを保存する必要があります。長さが不明なURLを保持するフィールドを定義するためのベストプラクティスは何ですか?


1
それはあなたが何を必要とするか、索引付け、統一性に依存しますか?
Thomas Decaux

2
ここではかなり簡単な答えを期待していましたが、私が考慮していなかった項目をカバーする答えにかなり驚いていました。私の教育用アカウントに追加した非常に興味深い読み物。
HPWD 2018

1
TEXTタイプをそのままにして、以下のすべての回答を読み飛ばしてください。結局、それが彼らのほとんどが示唆していることです。:)もちろん、インデックス付けや一意性が必要な場合はVARCHAR簡単TEXTにインデックス付けできないため、に進んでください。
Aleksandar

回答:


324
  1. 一般的なWebブラウザーの中で最も一般的な分母の最大URL長:2,083(Internet Explorer)

  2. 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バイト)と使用される文字セットの影響を受けます。

  3. だから... ...
    <MySQLの5.0.3利用TEXT
    または
    > =のMySQL 5.0.3使用VARCHAR(2083)


14
良い答えですが、個人的には長さを制限します。プロジェクトによっては、受け入れられるURLを制限したい場合があります。200より長いURLを使用しているのは誰ですか?
John

2
オラクルのようにインデックス付けと検索が効率的に行われるように、uriの構造を「理解」するuriデータ型を考えた方がいいです...待機、mysqlはオラクルの... download.oracle.com/docs/ cd / B10464_05 / web.904 / b12099 /…
redben

80
この答えは少し誤解を招くものです。ここで「最小公分母」は意味がないことに注意してください。ブラウザーまたはサーバーが受け入れる最大数を使用する必要があります(これは一貫しておらず、変更される可能性があります)。あなたのリンクが言うように:「... HTTPプロトコルの仕様は最大長を指定していません...」なので、気にしないでVARCHAR(2083)、を使用してくださいTEXT
ウェズリー・マーチ

4
例:リンクから:「65,536文字を超えると、Windows Firefox 1.5.xでロケーションバーにURLが表示されなくなります。ただし、より長いURLは機能します。100,000文字を超えるとテストを停止しました。
Wesley Murch '17

1
boutell.comリソースがネットから落ちました。ここでスキャンしたオライリーの本の中で、それへの参照です:books.google.ca/...
micahwittman

33

VARCHAR(512)(または同様の)で十分です。ただし、問題のURLの最大長がわからないので、直接に移動する場合がありTEXTます。もちろん、これの危険性は、CLOBsがのような単純な文字列データ型よりもはるかに遅いため、効率が低下することVARCHARです。


照合はどうですか?
kommradHomer 2017年

16

varchar(max) SQLServer2005

varchar(65535) MySQL 5.0.3以降の場合

これにより、必要に応じてストレージが割り当てられ、パフォーマンスには影響しません。


1
あなたのスニペットではmax、必要に応じてVARCHARサイズを増やすための魔法のANSI SQL指定子ですか、それとも単なる例としてメタ変数ですか?
Daniel Spiewak、2008年

4
MySQLでは、テーブル内の唯一の列でない限り、それほど大きなvarcharを持つことはできません。
カーソン、2008年

1
@Daniel Spiewak:「TEXTとVARCHAR(MAX)の基本的な違いは、TEXT型は常にblobにデータを格納するのに対し、VARCHAR(MAX)型は8kを超えない限り、データを行に直接格納しようとすることです。制限があり、その時点でBLOBに保存されます。」 stackoverflow.com/questions/834788/… しかし、質問はMySQLに関するものだったので、ここではあまり関係ありません。
Stijn Bollen 2014年

9

URLが使用される頻度と、実際に長さをバインド解除する必要があるかどうかに基づいて、TEXT列またはVARCHAR列を選択する必要があります。

以下の場合、micahwittmanが提案するように、maxlength> = 2,083のVARCHARを使用します。

  1. クエリごとに多くのURLを使用します(TEXT列とは異なり、VARCHARは行にインラインで格納されます)
  2. あなたはURLが65,535バイトの行制限を決して超えないことを確信しています。

次の場合はTEXTを使用します。

  1. URLは実際に65,535バイトの行制限を超える可能性があります
  2. クエリは、一度に(または非常に頻繁に)一連のURLを選択または更新しません。これは、TEXT列がポインターをインラインで保持するだけであり、参照データの取得に伴うランダムアクセスが困難になる可能性があるためです。

9

VARCHARをASCII文字エンコードで使用する必要があります。URLはパーセントでエンコードされており、国際ドメイン名はpunycodeを使用しているため、ASCIIで保存できます。これはUTF8よりもはるかに少ないスペースを使用します。

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL

5
UTF-8は、必要な場合にのみ、より多くのスペースを使用しませんか?
kommradHomer 2017年

7

これは実際にはユースケースに依存しますが(以下を参照)、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

注意と警告

  • 明らかに、Twitterの方が優れていますが、私のアプリのニーズには、URLの短縮を推奨することで十分でした。
  • URL短縮プログラムには、セキュリティ上の懸念などの欠点があります。私の場合、URLは公開されておらず、頻繁に使用されていないため、大きなリスクではありません。ただし、これは明らかにすべての人に役立つわけではありません。safe.mnは多くのスパムとフィッシングURLをブロックしているように見えますが、私はまだ注意を勧めます。
  • ユーザーにURL短縮機能の使用を強制するべきではないことに注意してください。ほとんどの場合(少なくとも私のアプリのニーズに対して)、500文字は、ほとんどのユーザーが使用するのに十分すぎるほどです。リンクが長すぎる場合は、短縮URLのみを使用/推奨してください。

10
組み込みのURL短縮サービスを提供している場合でも、完全なURLを機能させるために、どこかにデータベースに格納する必要はありませんか?:-)
Neil Neyman 2014年

2
もちろん; しかし、ほとんどの人が自分でショートナーを書くとは思えません。:これを書いているので、私はそこに(71がここに記載されていますから、多くのURL短縮のAPIがあることを学んだprogrammableweb.com/news/...あなたも、あなた自身を記述することなく、プロセスを自動化することができるように、)。もちろん、それはまだユーザーの知識と同意に依存しています。
2014年



1

ほとんどのWebサーバーには、URLの長さに制限があります(これにより、「URIが長すぎます」のエラーコードが表示されます)。最も人気のあるWebサーバーのデフォルトの長さ制限を見つけ、それらの最大値をフィールドの最大サイズとして使用します。十分すぎるほどです。


1

(サイズの点で)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文字の最大数であるため、他のフィールドや文字セットにも依存するため、これは意味を持ちません。
フリンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.