Bir URL için en iyi veritabanı alanı türü


352

Bir url'yi MySQL tablosunda saklamam gerekiyor. Uzunluğu belirlenmemiş bir URL'ye sahip bir alan tanımlamak için en iyi uygulama hangisidir?


1
İhtiyacınız olan şey, indeksleme, teklik nedir?
Thomas Decaux

2
Burada oldukça basit bir cevap bekliyordum ama düşünmediğim öğeleri kapsayan cevaplara oldukça şaşırdım. Eğitim hesabıma eklediğim çok ilginç bir okuma.
HPWD

1
Sadece TEXTtürü ile gidin ve aşağıdaki tüm cevapları okuma atlayın. Sonunda, çoğu böyle önerir. :) Tabii ki, eğer endeksleme veya teklik gerekiyorsa, o kadar kolay endekslenemez VARCHARçünkü gidin . TEXT
Aleksandar

Yanıtlar:


324
  1. Popüler web tarayıcıları arasında en düşük ortak payda maks. URL uzunluğu: 2,083 (Internet Explorer)

  2. http://dev.mysql.com/doc/refman/5.0/en/char.html
    VARCHAR sütunlarındaki değerler değişken uzunluklu dizelerdir. Uzunluk, MySQL 5.0.3'ten önce 0 ila 255 ve 5.0.3 ve sonraki sürümlerde 0 ila 65.535 arasında bir değer olarak belirtilebilir. MySQL 5.0.3 ve sonraki sürümlerde VARCHAR'ın etkin maksimum uzunluğu, maksimum satır boyutuna (tüm sütunlar arasında paylaşılan 65.535 bayt) ve kullanılan karakter kümesine tabidir.

  3. Yani ...
    <MySQL 5.0.3 TEXT kullan
    veya
    > = MySQL 5.0.3 VARCHAR kullan (2083)


14
Güzel cevap, ama şahsen ben uzunluğu sınırlar. Projeye bağlı olarak, kabul edilen URL'leri sınırlamak isteyebilirsiniz. Kim 200'den fazla url longet kullanıyor?
John

2
Onlar uri yapısını "anlayan" bir uri veri türü bulsa iyi olur, böylece indeksleme ve arama verimli bir şekilde yapılır, oracle gibi ... bekle, mysql şimdi oracle's ... download.oracle.com/docs/ cd / B10464_05 / web.904 / b12099 /…
redben

80
Bu cevap biraz yanıltıcı. Buradaki "En düşük ortak payda" nın anlamsız olduğunu, bir tarayıcının veya sunucunun kabul edeceği en yüksek sayıyı kullanmak istediğinizi unutmayın (tutarlı değildir ve değişebilir). Bağlantınızın söylediği gibi: " ... HTTP protokolünün belirtimi herhangi bir maksimum uzunluk belirtmiyor ... ", bu yüzden bununla uğraşmayın VARCHAR(2083), sadece kullanın TEXT.
Wesley Murch

4
Örneğin, bağlantınızdan da: " 65.536 karakterden sonra, konum çubuğu artık Windows Firefox 1.5.x'de URL'yi görüntülemiyor. Ancak, daha uzun URL'ler çalışacak. 100.000 karakterden sonra test etmeyi bıraktım. "
Wesley Murch

1
Boutell.com kaynağı ağdan düştü. Taranmış O'Reilly kitabında buna bir referans: books.google.ca/…
micahwittman

33

VARCHAR(512)(veya benzeri) yeterli olmalıdır. Ancak, söz konusu URL'lerin maksimum uzunluğunu gerçekten bilmediğiniz için, doğrudan yönlendirebilirim TEXT. Bununla ilgili tehlike, elbette CLOB, basit bir dize veri tipinden çok daha yavaş olması nedeniyle verimlilik kaybıdır VARCHAR.


harmanlama ne olacak?
kommradHomer

16

varchar(max) SQLServer2005 için

varchar(65535) MySQL 5.0.3 ve üstü için

Bu, depolama alanını ihtiyaç olarak tahsis eder ve performansı etkilemez.


1
Snippet'inizde, maxVARCHAR boyutunu gerektiği gibi büyütmek için sihirli bir ANSI SQL belirleyicisi mi yoksa sadece uğruna bir meta değişkeni mi?
Daniel Spiewak

4
MySQL'de büyük olasılıkla tablodaki tek sütun olmadıkça bu kadar büyük bir varchar'a sahip olamazsınız.
carson

1
@Daniel Spiewak: "TEXT ve VARCHAR (MAX) arasındaki temel fark, bir TEXT türünün verileri her zaman bir blobda saklayacağı, VARCHAR (MAX) türünün ise verileri 8k'yi aşmadığı sürece doğrudan satırda depolamaya çalışmasıdır. ve bu noktada onu bir damla içinde saklar. " stackoverflow.com/questions/834788/… Ama soru MySQL hakkındaydı, bu yüzden burada gerçekten alakalı değil.
Stijn Bollen

9

URL'nin ne sıklıkta kullanılacağına ve aslında bağlanmamış olması için uzunluğa ihtiyacınız olup olmadığına bağlı olarak bir METİN veya VARCHAR sütunu arasında seçim yapmak isteyeceksiniz .

Kullanım VARCHAR maxlength ile> = 2083 olarak micahwittman eğer önerdi:

  1. Sorgu başına çok sayıda URL kullanırsınız (METİN sütunlarından farklı olarak, VARCHAR'lar satırla birlikte depolanır)
  2. Bir URL'nin asla 65.535 bayt satır sınırını aşmayacağından emin olabilirsiniz.

Kullanım METİN eğer:

  1. URL gerçekten 65.535 bayt satır sınırını aşabilir
  2. Sorgularınız bir grup URL'yi aynı anda (veya çok sık) seçmez veya güncellemez. Bunun nedeni, METİN sütunlarının yalnızca bir işaretçiyi satır içinde tutması ve başvurulan verilerin alınmasında yer alan rastgele erişimlerin ağrılı olabilmesidir.

9

ASCII karakter kodlamalı bir VARCHAR kullanmalısınız. URL'ler yüzde olarak kodlanır ve uluslararası alan adları punycode kullanır, bu nedenle ASCII bunları saklamak için yeterlidir. Bu UTF8'den çok daha az alan kullanır.

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

5
UTF-8 sadece gerektiğinde daha fazla alan kullanmıyor mu?
kommradHomer

7

Bu gerçekten kullanım durumunuza bağlıdır (aşağıya bakın), ancak TEXTperformans sorunları olduğu gibi saklamak ve VARCHARçoğu durumda aşırı doldurma gibi büyük sesler.

Yaklaşımım: Cömert, ama mantıksız derecede büyük olmayan bir VARCHARuzunluk kullanın, VARCHAR(500)ya da böyle, ve daha büyük bir URL'ye ihtiyaç duyan kullanıcıları gibi bir URL kısaltmasını kullanmaya teşvik edin safe.mn.

Twitter yaklaşımı: Gerçekten güzel bir UX için, aşırı uzun URL'ler için otomatik bir URL kısaltıcı sağlayın ve bağlantının "görüntü sürümünü", sonunda elips içeren URL'nin bir parçası olarak saklayın. (Örnek: http://stackoverflow.com/q/219569/1235702olarak görüntülenir stackoverflow.com/q/21956...ve kısaltılmış bir URL'ye bağlanır http://ex.ampl/e1234)

Notlar ve Uyarılar

  • Açıkçası Twitter yaklaşımı daha güzel, ancak uygulamamın ihtiyaçları için bir URL kısaltıcısı önermek yeterliydi.
  • URL kısaltıcılarının güvenlik endişeleri gibi dezavantajları vardır. Benim durumumda, büyük bir risk değil çünkü URL'ler herkese açık değil ve yoğun bir şekilde kullanılmıyor; ancak bu herkes için geçerli değildir. safe.mn bir sürü spam ve phishing URL'sini engelliyor gibi görünüyor, ancak yine de dikkatli olmanızı öneririm.
  • Kullanıcılarınızı bir URL kısaltıcı kullanmaya zorlamamanız gerektiğini unutmayın. Çoğu durumda (en azından uygulamamın ihtiyaçları için), çoğu kullanıcının ne kullanacağı için 500 karakter aşırı derecede yeterlidir. Bir URL kısaltmasını yalnızca çok uzun bağlantılar için kullanın / önerin.

10
Yerleşik bir URL kısaltıcısı sağlıyorsanız, tam uzunlukta URL'yi çalışması için bir yerde bir veritabanında saklamanız gerekmez mi? :-)
Neil Neyman

2
Elbette; ama çoğu insanın kendi kısaltmasını yazacağından şüpheliyim. Bunu yazdığından beri, orada çok sayıda URL kısaltma API'si olduğunu öğrendim (71 burada listelenmiştir: programmableweb.com/news/… ), böylece kendi yazmanıza bile gerek kalmadan süreci otomatikleştirebilirsiniz. Tabii ki hala kullanıcı bilgisine ve rızasına bağlıdır.
brokethebuilda6



1

Çoğu web sunucusunun URL uzunluk sınırı vardır (bu nedenle "URI çok uzun" için bir hata kodu vardır), yani pratik bir üst boyut vardır. En popüler web sunucuları için varsayılan uzunluk sınırını bulun ve bunların en büyüğünü alanın maksimum boyutu olarak kullanın; fazlasıyla yeterli olmalı.


1

Varchar (max) kullanmanız daha iyi olur ( boyut olarak) varchar (65535). Bu, daha büyük web adreslerinizi bile saklar ve alanınızı da korur.

Maks belirleyici, varchar, nvarchar ve varbinary veri türlerinin depolama yeteneklerini genişletir. varchar (max), nvarchar (max) ve varbinary (max) toplu olarak büyük değer veri türleri olarak adlandırılır. 2 ^ 31-1 bayta kadar veri depolamak için büyük değerli veri türlerini kullanabilirsiniz.

Büyük Değerli Veri Türlerini Kullanma hakkında TechNet'teki bu makaleye bakın


varchar (max)SQLServer sözdizimidir, MySQL için uygun değildir (orijinal soruda olduğu gibi). Ayrıca, varchar (65535)65535'in mysql cinsinden bir satırdaki maksimum ASCII karakter sayısı olduğu anlamına gelmez , bu nedenle diğer alanlara ve karakter kümesine de bağlıdır.
furins
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.