SQL Server Metin türü ve varchar veri türü karşılaştırması [kapalı]


287

Değişken uzunlukta karakter verileri var ve SQL Server (2005) veritabanında saklamak istiyorum. TEXT SQL tipinin nasıl seçileceği veya performans / ayak izi / fonksiyonda VARCHAR SQL tipinin, artılarının ve eksilerinin nasıl seçileceği hakkında en iyi uygulamaları öğrenmek istiyorum.


17
Google sizi buraya gönderdiyse: MSDN SQL Veri Türleri sayfası yardımcı olabilir.
Jeroen

Yanıtlar:


213

SQL Server 2005 veya üstünü kullanıyorsanız kullanın varchar(MAX). Veri texttürü kullanımdan kaldırılmıştır ve yeni geliştirme çalışmaları için kullanılmamalıdır. Gönderen docs :

Önemli

ntext,, textve imageveri türleri Microsoft SQL Server'ın gelecekteki bir sürümünde kaldırılacaktır. Bu veri türlerini yeni geliştirme işlerinde kullanmaktan kaçının ve şu anda kullanan uygulamaları değiştirmeyi planlayın. Kullanım nvarchar (max) , varchar (max) ve varbinary (max) yerine.


3
Teşekkürler Mladen, TEXT'in kullanımdan kaldırıldığını görünce şaşırdım. Bundan bahseden resmi bir belgeniz var mı?
George2

1
Bu "resmi" olmasa da temelleri kapsar. Metin aslında amortismana tabi tutulur ve arama ve dizine ekleme yeteneği gibi varchar (max) 'ın yaptığı her şeyi desteklemez. blog.sqlauthority.com/2007/05/26/…
achinda99

32
Bu mümkün olduğunca resmi olduğunu :) msdn.microsoft.com/en-us/library/ms187993.aspx
Mladen Prajdic

1
Serin achinda99 ve Mladen Prajdic! Sağladığınız şey aradığım şey. :-) Bir soru daha, farklı durumlarda VARCHAR veya VARCHAR (MAX) kullanmayı nasıl seçeriz?
George2

1
Bu konuda resmi MS bilgileri kullanımdan kaldırılmıştır: msdn.microsoft.com/en-us/library/ms187993%28v=sql.90%29.aspx
Fanda

283

TEXTbüyük dize verileri parçaları için kullanılır. Alanın uzunluğu belirli bir eşiği aşarsa, metin satır dışında saklanır.

VARCHARher zaman satırda saklanır ve 8000 karakter sınırlaması vardır . Bir x oluşturmaya çalışırsanız VARCHAR(x), burada x> 8000 , bir hata alırsınız:

Sunucu: Msg 131, Seviye 15, Durum 3, Hat 1

'Varchar' türüne verilen boyut (), herhangi bir veri türü için izin verilen maksimum değeri aşıyor (8000)

Bunlar uzunluk sınırlamaları endişe yok VARCHAR(MAX)içinde SQL Server 2005 gibi, sıranın dışına saklanabilir, TEXT.

Not MAXBurada sabit bir tür değildir, VARCHARve VARCHAR(MAX)tükenen çok yakın çok farklı türleri vardır TEXT.

SQL Server'ın önceki sürümlerinde TEXTdoğrudan erişemediniz, sadece bir alabilir TEXTPTRve içinde READTEXTve WRITETEXTişlevlerinde kullanabilirsiniz.

Gelen SQL Server 2005 yapabilirsiniz doğrudan erişim TEXTkolonları (eğer hala açık döküm ihtiyaç olsa VARCHARonlar için bir değer atamak için).

TEXT iyidir:

  • Büyük metinleri veritabanınızda depolamanız gerekiyorsa
  • Sütunun değerini aramazsanız
  • Bu sütunu nadiren seçerseniz ve üzerine eklemezseniz.

VARCHAR iyidir:

  • Küçük teller saklarsanız
  • Dize değerinde arama yaparsanız
  • Her zaman seçerseniz veya birleştirmelerde kullanırsanız.

By seçerek burada sütunun değeri döndürmek herhangi sorgular veren demek.

By arama Burada Kimin sonuç değerine bağlıdır herhangi sorgular veren demek TEXTveya VARCHARsütunda. Bu, herhangi bir durumda JOINveya WHEREdurumda kullanmayı içerir .

Gibi TEXTsatır dışında depolanan, kapsamayan sorgular TEXTsütunu genellikle daha hızlıdır.

Neyin TEXTiyi olduğuna dair bazı örnekler :

  • Blog yorumları
  • Wiki sayfaları
  • Kod kaynağı

Neyin VARCHARiyi olduğuna dair bazı örnekler :

  • Kullanıcı adları
  • Sayfa başlıkları
  • Dosya adları

Genel bir kural olarak, 200 karakteri aşmak için metin değerine ihtiyacınız varsa VE bu sütunda birleştirme kullanmayın TEXT.

Aksi takdirde kullanın VARCHAR.

PS Aynısı , yukarıdaki örnekler için kullanmanız gereken UNICODEetkin NTEXTve aynı zamanda geçerlidir NVARCHAR.

PPS aynı uygulanır VARCHAR(MAX)ve NVARCHAR(MAX)bu SQL Server 2005+ kullanım yerine TEXTve NTEXT. Sen etkinleştirmeniz gerekir large value types out of rowile onlar için sp_tableoptionbunları hep sıranın dışına saklanan olmak istiyorsanız.

Yukarıda ve bahsedildiği gibi burada , TEXTgelecek sürümlerde kaldırılmış olacak:

text in rowSeçenek gelecekteki bir sürümüne kaldırılacaktır SQL Server . Yeni geliştirme işlerinde bu seçeneği kullanmaktan kaçının ve şu anda kullanılan uygulamaları değiştirmeyi planlayın text in row. Size kullanarak büyük veri depolamak öneririz varchar(max), nvarchar(max)ya varbinary(max)veri türlerini. Bu veri türlerinin satır içi ve satır dışı davranışını denetlemek için large value types out of rowseçeneği kullanın.


2
1. "Sütunun değerinde arama yapmazsanız" - "arama" ne demek istediğinizi gösterebilir misiniz? Bu sütunu seçin, bu sütunu sipariş edin, bu sütunu beğenin veya bu sütunda bazı dize düzenleme işlevleri mi kullanıyorsunuz?
George2

2
2. "VARCHAR her zaman satırda saklanır ve 8000 karakter sınırına sahiptir." - üzgünüm sana katılmıyorum. VARCHAR 8000'den uzun olabilir ve 8000'den uzunsa, VARCHAR sütunlar dışında saklanır. Herhangi bir yorum?
George2

1
3. Bu konuda bahsi geçen Mladen Prajdic, METİN tipi kullanımdan kaldırılmıştır, ancak bunu kapsayan herhangi bir belge bulamıyorum. Bunu kapsayan herhangi bir belgeniz var mı?
George2

2
Harika Quassnoi! Çok bilgilisin! :-) Bir soru daha - "Bu elbette SQL SERVER 2005 için METİN eşanlamlı olan VARCHAR (MAX) ile ilgili değildir." "Bu" ne demek istiyorsun?
George2

"Bu elbette SQL SERVER 2005 için METİN ile eşanlamlı olan VARCHAR (MAX) ile ilgili değildir." - SQL Server 2005'te TEXT'in VARCHAR ile aynı olduğunu belirten belgeleriniz var mı? Biraz arama yaptım ama resmi belgeler bulamıyorum. :-)
George2

42

SQL server 2005 yeni veri türleri tanıtıldı: varchar(max)ve nvarchar(max) onlar eski metin Çeşidi avantajlara sahipler: 2GB veri op içerebilir, fakat aynı zamanda avantajlarından çoğuna sahip varcharve nvarchar. Bu avantajlar arasında substring () gibi dize düzenleme işlevlerini kullanma yeteneği de vardır.

Ayrıca, boyut 8Kb'ın altındayken varchar (max) tablonun (disk / bellek) alanında saklanır. Yalnızca alana daha fazla veri koyduğunuzda, tablonun alanından depolanır. Tablonun alanında depolanan veriler (genellikle) daha hızlı geri alınır.

Kısacası, daha iyi bir alternatif olduğu için asla Metin kullanmayın: (n) varchar (max). Ve sadece normal bir varchar yeterince büyük olmadığında varchar (max) kullanın, yani saklayacağınız dizenin 8000 karakteri geçeceğini düşünüyorsanız.

Belirtildiği gibi TEXT veri tipinde SUBSTRING kullanabilirsiniz, ancak TEXT alanları 8000'den az karakter içerdiği sürece.


1
Teşekkürler Edoode, VARCHAR'ın ne kadar iyi olduğunu, ancak VARCHAR'ın ne zaman ve TEXT'in ne zaman kullanılacağı hakkında herhangi bir yorum veya fikir cevapladınız mı? Benim sorum 2 sayıdan 1 seçimi ile ilgili. :-)
George2

1
Aslında, MS SQL Server 2005'te METİN sütunlarında SUBSTRING ve diğer işlevleri de kullanabilirsiniz.
Quassnoi

1
Teşekkürler Quassnoi! TEXT kullanımdan kaldırılmış gibi görünüyor. Bir soru daha, VARCHAR veya VARCHAR (MAX) 'ı farklı durumlarda nasıl kullanacağımızı nasıl seçebiliriz?
George2

1
Varchar (max) değerini yalnızca normal bir varchar yeterince büyük olmadığında kullanın (8Kb herkes için yeterli olmalıdır;)
edosoft

7

MS 2008'de bazı büyük değişiklikler oldu -> Hangi veri türünün kullanılacağına karar verirken aşağıdaki makaleyi dikkate almaya değer olabilir. http://msdn.microsoft.com/en-us/library/ms143432.aspx

Bayt başına

  1. varchar (max), varbinary (max), xml, metin veya resim sütunu 2 ^ 31-1 2 ^ 31-1
  2. nvarchar (maks.) sütun 2 ^ 30-1 2 ^ 30-1

3
Değişiklikler? Yeni veri türleri piyasaya sürüldüğünden bu kapasiteler değişmedi.
Martin Smith
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.