nvarchar (maks.) ve NText


183

SQL Server'da nvarchar(max)vs. NTextveri türlerini kullanmanın avantajları ve dezavantajları nelerdir? Geriye dönük uyumluluğa ihtiyacım yok, bu yüzden nvarchar(max)eski SQL Server sürümlerinde desteklenmiyor.

Düzenleme: Anlaşılan soru da geçerlidir TEXTve IMAGEvs varchar(max)ve varbinary(max)daha sonra bu veri türleri için bu arama için.

Yanıtlar:


197

Avantajları aşağıdaki gibi işlevleri kullanabilmeniz olan LENve LEFTüzerinde nvarchar(max)ve buna karşı yapamaz ntextve text. Ayrıca çalışmak zorunda nvarchar(max)olduğunuz textyerden daha kolaydır WRITETEXTve UPDATETEXT.

Ayrıca text, ntextvb kaldırılmaktadır ( http://msdn.microsoft.com/en-us/library/ms187993.aspx )


12
SQL Server 2016 görünüşte onları destekleyecektir.
Confluence

1
@ Confluence Tarihsel olarak, SQL Server'daki varlıkları söz konusu olduğunda metin ve nText eski veri türü varchar ve nvarchar'dan daha mı?
RBT

WRITETEXT ve UPDATETEXT kullanmanız gerekmez. Belki de 2010'da yaptın! Daha fazla bilgi için ilgileniyorum.
Simon_Weaver

38

VARCHAR(MAX)TEXTalanı barındıracak kadar büyük . TEXT, NTEXTVe IMAGESQL Server 2000'in veri tipleri, SQL Server'ın gelecekteki sürümünde SQL Server 2005 veri türlerine geriye dönük uyumluluk sağlayan kaldırılacaktır ancak yeni bir veri türleri kullanılması önerilir VARCHAR(MAX), NVARCHAR(MAX)ve VARBINARY(MAX).


32

ntextverileri her zaman ayrı bir veritabanı sayfasında nvarchar(max)saklarken, verileri veritabanı kaydının içinde saklamaya çalışır.

Yani nvarchar(max)biraz daha hızlı (8 kB'dan daha küçük bir metniniz varsa). Ayrıca veritabanı boyutunun biraz daha yavaş büyüyeceğini fark ettim, bu da iyi.

Git nvarchar(max).


13

nvarchar(max)kullanmak istediğiniz şeydir. En büyük avantajı, bu veri türündeki tüm T-SQL dize işlevlerini kullanabilmenizdir. Bu mümkün değil ntext. Gerçek dezavantajların farkında değilim.


Anlamadığım şey, gitmeleri gerektiğini söyledikleri, nvarchar(max)ancak bu beni 4000 karakterle sınırlıyor. Bir alanın bundan daha fazlasına sahip olmasını istersem ne olur?
VoidKing

2
nvarchar (max) sizi 4000 karakterle sınırlamaz. Sınırsız sayıda karakteriniz var. Ayrıca, metin ve ntext SQL Server tarafından kullanımdan kaldırılmıştır. Bu, gelecekteki bir sürümde artık desteklenmeyecekleri anlamına gelir.
Randy Minder

OIC, nvarchar(max)4000 karakterle sınırlayan SQL Server CE kullanıyorum . SQL Server Compact için, ntextbazı durumlarda kullanmaktan başka çarem yok . Bunu bıraktıklarında, sanırım sadece bazı siteleri yükseltmem gerekecek.
VoidKing

1
@RandyMinder nvarchar (max) sınırsız depolama alanı değildir. SQL Server belgelerine göre "max, maksimum depolama boyutunun 2 ^ 31-1 bayt (2 GB) olduğunu gösterir. Bayt cinsinden depolama boyutu, girilen verilerin gerçek uzunluğunun + 2 baytın iki katıdır."
Shiv


4

En büyük dezavantajı Text(birlikte NTextve Image) o tarafından olduğu gibi, SQL Server'ın ilerideki bir sürümünde kaldırılacaktır olmasıdır belgelere . Bu, SQL Server'ın bu sürümü yayınlandığında şemanızın yükseltilmesini zorlaştıracaktır.


3

Dönüştürme deneyimimi eklemek istedim. textEski Linq2SQL kodunda birçok alanım vardı . Bu, textdizinlerde bulunan sütunların ONLINE olarak yeniden oluşturulmasına izin vermekti .

İlk yıl için faydaları hakkında biliyorum, ama her zaman dönüştürme SQL Server tablo yeniden inşa etmek ve her şeyi kopyalamak, web siteleri aşağı getirmek ve kalbimi yükseltmek zorunda bazı korkunç uzun sorguları anlamına geleceğini varsaydı.

Ben de Linq2SQL sütun türünün bir tür doğrulama yapıyor olsaydı hatalara neden olabilir endişeliydi.

Yine de ALTER komutlarının ANINDA döndüğünü bildirmekten mutluluk duyuyoruz - bu yüzden kesinlikle sadece tablo meta verilerini değiştiriyorlar. <8000 karakter verisini tekrar tablo haline getirmek için bazı çevrimdışı çalışmalar olabilir, ancak ALTER komutu anında gerçekleşti.

Dönüşüm gerektiren tüm sütunları bulmak için aşağıdakileri çalıştırdım:

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] VARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'TEXT' order by table_name, column_name

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] NVARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'NTEXT' order by table_name, column_name

Bu, yeni seçtiğim ve yeni bir pencereye kopyaladığım güzel bir sorgu listesi verdi. Dediğim gibi - bunu çalıştırmak anında oldu.

resim açıklamasını buraya girin

Linq2SQL oldukça eskidir - tabloları sürüklediğiniz bir tasarımcı kullanır. Durum önce EF Kodu için daha karmaşık olabilir, ancak henüz bu konuyu ele almadım.


1

Kısmi veya tam güncellemeler için .WRITE yan tümcesini ve varchar(max)/nvarchar(max)veri türlerine yüksek performans eklemeleri kullanabileceğinizi eklemek istiyorum .

Burada.WRITE fıkra kullanımına ilişkin tam bir örnek bulabilirsiniz .

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.