nvarchar (maks) vs NText

183

Apa kelebihan dan kekurangan menggunakan tipe data nvarchar(max)vs. NTextdalam SQL Server? Saya tidak perlu kompatibilitas ke belakang, jadi tidak apa-apa yang nvarchar(max)tidak didukung dalam rilis SQL Server yang lebih lama.

Sunting: Rupanya pertanyaan itu juga berlaku untuk TEXTdan IMAGEvs. varchar(max)dan varbinary(max), bagi mereka yang mencari tipe data itu nanti.

David Pfeffer
sumber

Jawaban:

197

Keuntungannya adalah Anda dapat menggunakan fungsi seperti LENdan LEFTaktif nvarchar(max)dan Anda tidak dapat melakukan itu terhadap ntextdan text. Ini juga lebih mudah untuk dikerjakan nvarchar(max)daripada di textmana Anda harus menggunakan WRITETEXTdan UPDATETEXT.

Juga, text, ntext, dll, sedang usang ( http://msdn.microsoft.com/en-us/library/ms187993.aspx )

SQLMenace
sumber
12
SQL Server 2016 tampaknya masih akan mendukung mereka.
Pertemuan
1
@ Confluence Secara historis, apakah teks dan nText tipe data yang lebih lama dari varchar dan nvarchar sejauh menyangkut keberadaannya di SQL Server?
RBT
Anda TIDAK HARUS menggunakan WRITETEXT dan UPDATETEXT. Mungkin di 2010 Anda melakukannya! Tertarik untuk info lebih lanjut.
Simon_Weaver
38

VARCHAR(MAX)cukup besar untuk menampung TEXTlapangan.TEXT, NTEXTdan IMAGEtipe data SQL Server 2000 akan ditinggalkan dalam versi SQL Server yang akan datang, SQL Server 2005 menyediakan kompatibilitas mundur untuk tipe data tetapi disarankan untuk menggunakan tipe data baru yaitu VARCHAR(MAX), NVARCHAR(MAX)dan VARBINARY(MAX).

garpunkal
sumber
32

ntext akan selalu menyimpan datanya di halaman basis data terpisah, sementara nvarchar(max) akan mencoba menyimpan data dalam catatan basis data itu sendiri.

Begitu nvarchar(max) agak lebih cepat (jika Anda memiliki teks yang lebih kecil seperti 8 kB). Saya juga memperhatikan bahwa ukuran basis data akan tumbuh sedikit lebih lambat, ini juga bagus.

Go nvarchar(max).

GvS
sumber
13

nvarchar(max)adalah apa yang ingin Anda gunakan. Keuntungan terbesar adalah bahwa Anda dapat menggunakan semua fungsi string T-SQL pada tipe data ini. Ini tidak mungkin dengan ntext. Saya tidak mengetahui adanya kerugian nyata.

Randy Minder
sumber
Apa yang saya tidak mengerti adalah bahwa mereka mengatakan untuk pergi nvarchar(max)tetapi membatasi saya untuk 4000 karakter. Bagaimana jika saya ingin sebuah bidang menampung lebih dari itu?
Voiding
2
nvarchar (maks) tidak membatasi Anda hingga 4000 karakter. Anda memiliki jumlah karakter yang tidak terbatas. Selain itu, teks dan ntext telah ditinggalkan oleh SQL Server. Ini berarti bahwa dalam versi yang akan datang, mereka tidak akan lagi didukung.
Randy Minder
OKI, saya menggunakan SQL Server CE, yang TIDAK membatasi nvarchar(max)4000 karakter saya. Jadi untuk SQL Server Compact, saya tidak punya pilihan selain menggunakan ntextdalam beberapa kasus. Ketika mereka menghentikannya, saya kira saya harus tidak memperbarui beberapa situs.
Membatalkan
1
@RandyMinder nvarchar (maks) bukan penyimpanan tanpa batas. Sesuai dokumentasi SQL Server "max menunjukkan bahwa ukuran penyimpanan maksimum adalah 2 ^ 31-1 byte (2 GB). Ukuran penyimpanan, dalam byte, adalah dua kali panjang data aktual yang dimasukkan + 2 byte."
Shiv
4

Anda seharusnya menggunakan nvarchar(max):

MSDN

WhiteWaterCoder
sumber
4

Kerugian terbesar dari Text(bersama-sama dengan NTextdan Image) adalah bahwa ia akan dihapus dalam versi SQL Server di masa depan, seperti pada dokumentasi . Itu secara efektif akan membuat skema Anda lebih sulit untuk ditingkatkan ketika versi SQL Server itu akan dirilis.

Klaus Byskov Pedersen
sumber
3

Ingin menambahkan pengalaman saya dengan mengonversi. Saya memiliki banyak textbidang dalam kode Linq2SQL kuno. Ini untuk memungkinkan textkolom yang ada dalam indeks untuk dibangun kembali ONLINE .

Pertama, saya sudah tahu tentang manfaat selama bertahun-tahun, tetapi selalu berasumsi bahwa konversi akan berarti beberapa pertanyaan panjang yang menakutkan di mana SQL Server harus membangun kembali tabel dan menyalin semuanya, menjatuhkan situs web saya dan meningkatkan detak jantung saya.

Saya juga khawatir bahwa Linq2SQL dapat menyebabkan kesalahan jika melakukan semacam verifikasi jenis kolom.

Senang melaporkan, bahwa perintah ALTER dikembalikan INSTAN - jadi mereka pasti hanya mengubah metadata tabel. Mungkin ada beberapa pekerjaan offline yang terjadi untuk mengembalikan <8000 data karakter ke dalam tabel, tetapi perintah ALTER instan.

Saya menjalankan yang berikut untuk menemukan semua kolom yang membutuhkan konversi:

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

Ini memberi saya daftar pertanyaan yang bagus, yang baru saja saya pilih dan salin ke jendela baru. Seperti saya katakan - menjalankan ini instan.

masukkan deskripsi gambar di sini

Linq2SQL cukup kuno - menggunakan desainer yang Anda tarik tabel. Situasinya mungkin lebih kompleks untuk Kode EF terlebih dahulu tetapi saya belum mengatasinya.

Simon_Weaver
sumber
1

Saya ingin menambahkan bahwa Anda dapat menggunakan klausa .WRITE untuk pembaruan sebagian atau penuh dan menambahkan kinerja tinggi untuk varchar(max)/nvarchar(max)tipe data.

Di sini Anda dapat menemukan contoh lengkap penggunaan .WRITEklausa.

Gotqn
sumber