SQL Server Jenis teks vs. tipe data varchar [ditutup]

287

Saya memiliki data karakter panjang variabel dan ingin menyimpan dalam database SQL Server (2005). Saya ingin mempelajari beberapa praktik terbaik tentang cara memilih tipe SQL TEXT atau memilih tipe VARCHAR SQL, pro dan kontra dalam kinerja / jejak / fungsi.

George2
sumber
17
Jika Google mengirim Anda ke sini: halaman MSDN SQL Data Types dapat membantu.
Jeroen

Jawaban:

212

Jika Anda menggunakan SQL Server 2005 atau lebih baru, gunakan varchar(MAX). Tipe textdata sudah usang dan tidak boleh digunakan untuk pekerjaan pengembangan baru. Dari dokumen :

Penting

ntext, text, Dan imagetipe data akan dihapus dalam versi masa depan dari Microsoft SQL Server. Hindari menggunakan tipe data ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakannya. Menggunakan nvarchar (max) , varchar (max) , dan varbinary (max) sebagai gantinya.

Mladen Prajdic
sumber
3
Terima kasih Mladen, saya terkejut melihat TEXT sudah usang. Apakah Anda memiliki dokumen resmi yang menyebutkan ini?
George2
1
Meskipun ini bukan "resmi" itu mencakup dasar-dasar. Teks sebenarnya didepresiasi & juga tidak mendukung semua yang varchar (maks) lakukan, seperti kemampuan untuk mencari & mengindeks. blog.sqlauthority.com/2007/05/26/…
achinda99
32
ini adalah sebagai resmi karena mendapat :) msdn.microsoft.com/en-us/library/ms187993.aspx
Mladen Prajdic
1
Cool achinda99 dan Mladen Prajdic! Apa yang Anda berikan adalah apa yang saya cari. :-) Satu pertanyaan lagi, bagaimana kita memilih apakah akan menggunakan VARCHAR atau VARCHAR (MAX) dalam situasi yang berbeda?
George2
1
Info MS resmi tentang itu sudah tidak digunakan lagi: msdn.microsoft.com/en-us/library/ms187993%28v=sql.90%29.aspx
Fanda
283

TEXTdigunakan untuk potongan besar data string. Jika panjang bidang melebihi ambang tertentu, teks disimpan di luar baris.

VARCHARselalu disimpan dalam baris dan memiliki batas 8000 karakter. Jika Anda mencoba membuat VARCHAR(x), di mana x> 8000 , Anda mendapatkan kesalahan:

Server: Msg 131, Level 15, State 3, Line 1

Ukuran () yang diberikan untuk tipe 'varchar' melebihi maksimum yang diizinkan untuk semua tipe data (8000)

Batasan panjang ini tidak terkait VARCHAR(MAX)dengan SQL Server 2005 , yang mungkin disimpan di luar baris, sama sepertiTEXT .

Perhatikan bahwa MAXini bukan jenis konstanta di sini, VARCHARdan VARCHAR(MAX)merupakan tipe yang sangat berbeda, yang terakhir sangat dekat TEXT.

Dalam versi SQL Server sebelumnya Anda tidak dapat mengakses TEXTsecara langsung, Anda hanya bisa mendapatkan TEXTPTRdan menggunakannya di READTEXTdanWRITETEXT fungsinya.

Di SQL Server 2005 Anda dapat langsung mengakses TEXTkolom (meskipun Anda masih membutuhkan pemeran eksplisit untukVARCHAR untuk menetapkan nilai bagi mereka).

TEXT itu baik:

  • Jika Anda perlu menyimpan teks besar di database Anda
  • Jika Anda tidak mencari pada nilai kolom
  • Jika Anda memilih kolom ini jarang dan jangan bergabung di dalamnya.

VARCHAR itu baik:

  • Jika Anda menyimpan string kecil
  • Jika Anda mencari pada nilai string
  • Jika Anda selalu memilih atau menggunakannya dalam gabungan.

Dengan memilih di sini, saya bermaksud mengeluarkan pertanyaan apa pun yang mengembalikan nilai kolom.

Dengan mencari di sini, saya bermaksud mengeluarkan pertanyaan apa pun yang hasilnya tergantung pada nilai kolom TEXTatau VARCHAR. Ini termasuk menggunakannya dalam kondisi JOINatau apa pun WHERE.

Karena TEXTdisimpan di luar baris, kueri yang tidak melibatkan TEXTkolom biasanya lebih cepat.

Beberapa contoh apa TEXTyang baik untuk:

  • Komentar blog
  • Halaman wiki
  • Sumber kode

Beberapa contoh apa VARCHARyang baik untuk:

  • Nama pengguna
  • Judul halaman
  • Nama file

Sebagai aturan praktis, jika Anda membutuhkan nilai teks melebihi 200 karakter DAN jangan gunakan gabung di kolom ini, gunakan TEXT.

Kalau tidak gunakan VARCHAR.

PS Hal yang sama berlaku untuk UNICODEdiaktifkan NTEXTdan NVARCHARjuga, yang harus Anda gunakan untuk contoh di atas.

PPS Hal yang sama berlaku untuk VARCHAR(MAX)dan NVARCHAR(MAX)yang digunakan oleh SQL Server 2005+ alih-alih TEXTdan NTEXT. Anda harus mengaktifkannya large value types out of rowdengan sp_tableoptionjika Anda ingin mereka selalu disimpan di luar baris.

Seperti yang disebutkan di atas dan di sini , TEXTakan ditinggalkan dalam rilis mendatang:

The text in rowpilihan akan dihapus dalam versi masa depan dari SQL Server . Hindari menggunakan opsi ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini digunakan text in row. Kami menyarankan Anda menyimpan data yang besar dengan menggunakan varchar(max), nvarchar(max)atau varbinary(max)tipe data. Untuk mengontrol perilaku tipe data ini in-line dan out-of-row, gunakan large value types out of rowopsi.

Quassnoi
sumber
2
1. "Jika Anda tidak mencari pada nilai kolom" - dapatkah Anda menunjukkan kepada saya apa yang Anda maksud dengan "pencarian"? Maksud Anda memilih kolom ini, memesan kolom ini, SUKA kolom ini atau menggunakan beberapa fungsi manipulasi string pada kolom ini?
George2
2
2. "VARCHAR selalu disimpan dalam baris dan memiliki batas 8000 karakter." - maaf saya tidak setuju dengan Anda. VARCHAR bisa lebih dari 8000 dan jika lebih dari 8000, VARCHAR akan disimpan selain di kolom. Ada komentar?
George2
1
3. Mladen Prajdic yang disebutkan di utas ini, tipe TEXT sudah usang, tapi saya tidak menemukan dokumen yang mencakup ini. Apakah Anda memiliki dokumen yang mencakup ini?
George2
2
Quassnoi keren! Anda sangat berpengetahuan! :-) Satu pertanyaan lagi - "Ini tentu saja tidak menyangkut VARCHAR (MAX), yang untuk SQL SERVER 2005 sinonim untuk TEXT." "Ini" maksudmu apa?
George2
"Ini tentu saja tidak menyangkut VARCHAR (MAX), yang untuk SQL SERVER 2005 adalah sinonim untuk TEXT." - Apakah Anda memiliki dokumen yang mengatakan TEXT sama dengan VARCHAR di SQL Server 2005? Saya melakukan pencarian tetapi tidak dapat menemukan dokumen resmi. :-)
George2
41

Dalam SQL server 2005 tipe data baru diperkenalkan: varchar(max)dan nvarchar(max) Mereka memiliki kelebihan dari jenis teks lama: mereka dapat berisi op 2GB data, tetapi mereka juga memiliki sebagian besar kelebihan varchardan nvarchar. Di antara kelebihan ini adalah kemampuan untuk menggunakan fungsi manipulasi string seperti substring ().

Juga, varchar (maks) disimpan di ruang (disk / memori) tabel sementara ukurannya di bawah 8Kb. Hanya ketika Anda menempatkan lebih banyak data di bidang, itu disimpan di luar ruang tabel. Data yang disimpan dalam ruang tabel (biasanya) diambil lebih cepat.

Singkatnya, jangan pernah menggunakan Teks, karena ada alternatif yang lebih baik: (n) varchar (maks). Dan hanya menggunakan varchar (maks) ketika varchar biasa tidak cukup besar, yaitu jika Anda mengharapkan string yang akan Anda simpan akan melebihi 8000 karakter.

Seperti disebutkan, Anda dapat menggunakan SUBSTRING pada tipe data TEXT, tetapi hanya selama bidang TEXT berisi kurang dari 8000 karakter.

edosoft
sumber
1
Terima kasih Edoode, Anda menjawab cukup lengkap seberapa baik VARCHAR, tetapi ada komentar atau ide tentang kapan harus menggunakan VARCHAR dan kapan harus menggunakan TEXT? Pertanyaan saya adalah tentang memilih 1 dari 2 masalah. :-)
George2
1
Sebenarnya, dalam MS SQL Server 2005 Anda dapat menggunakan SUBSTRING dan fungsi lainnya pada kolom TEKS juga.
Quassnoi
1
Terima kasih Quassnoi! Sepertinya TEXT sudah usang. Satu pertanyaan lagi, bagaimana kita memilih apakah akan menggunakan VARCHAR atau VARCHAR (MAX) dalam situasi yang berbeda?
George2
1
Hanya gunakan varchar (maks) ketika varchar biasa tidak cukup besar (8Kb harus cukup untuk semua orang;)
edosoft
7

Ada beberapa perubahan besar dalam ms 2008 -> Mungkin patut dipertimbangkan artikel berikut saat membuat keputusan tentang tipe data apa yang akan digunakan. http://msdn.microsoft.com/en-us/library/ms143432.aspx

Bytes per

  1. varchar (max), varbinary (max), xml, teks, atau kolom gambar 2 ^ 31-1 2 ^ 31-1
  2. nvarchar (maks) kolom 2 ^ 30-1 2 ^ 30-1
Draz
sumber
3
Perubahan? Kapasitas ini belum berubah sejak tipe data baru diperkenalkan.
Martin Smith