Memahami kolom varchar (max) 8000 dan mengapa saya dapat menyimpan lebih dari 8000 karakter di dalamnya

13

Dari dokumen Microsoft ini , +

n mendefinisikan panjang string dan dapat berupa nilai dari 1 hingga 8.000. maks menunjukkan bahwa ukuran penyimpanan maksimum adalah 2 ^ 31-1 byte (2 GB). Ukuran penyimpanan adalah panjang sebenarnya dari data yang dimasukkan + 2 byte.

Tolong bantu saya memahami ini.

Karakter maksimal untuk varchar tampaknya 8000, yang jauh lebih sedikit dari 2GBnilai data.

Saya melihat bahwa ada catatan di varchar(max)kolom ini dari tabel tertentu yang memiliki len(mycolumn)> 100.000. Jadi saya tahu saya bisa mendapatkan lebih dari 8000karakter ke dalam varchar(max)kolom.

Pertanyaan 1: Bagaimana 8000karakter dimainkan dan di mana saya harus menyadarinya?

Pertanyaan 2 : apakah kueri datareader .net ke kolom ini akan selalu mengembalikan hasil lengkap dengan 100.000 karakter?

Peter PitLock
sumber
Catatan yang varchar(max)pernah dipanggil textdan diperlakukan sebagai tipe data yang berbeda.
Tuan Lister
Mungkin baca ini ? Ini terkait dengan ukuran halaman 8K. Nilai yang terlalu besar untuk muat dalam satu halaman (batas sebenarnya sedikit lebih besar dari 8000) disimpan ke halaman LOB_DATA (Large OBject).
Justin

Jawaban:

30

Saya bisa melihat mengapa Anda salah paham tentang ini - ini agak rumit. Ini semua valid:

  • VARCHAR (1) - satu karakter string
  • VARCHAR (4000) - 4.000 karakter
  • VARCHAR (8000) - 8.000 karakter - dan jika Anda menggunakan angka untuk definisi bidang ini, itu NUMBER tertinggi yang dapat Anda gunakan, tetapi perhatikan ini:
  • VARCHAR (MAX) - yang bisa menampung hingga 2GB.

Dan ya, jika Anda mencoba untuk mendapatkan data dari bidang VARCHAR (MAX), dan seseorang menyimpan 2GB di sana, pasang sabuk pengaman.

Brent Ozar
sumber
3
and somebody stored 2GB in there, buckle up.- Pernah ke sana dengan beberapa file gumpalan
Ruslan
7

Pertanyaan 1: Bagaimana 8000 karakter berperan dan di mana saya harus menyadarinya?

Pengaturan n hingga 8000 menyebabkan 8000 karakter ikut bermain. Anda perlu mengetahui referensi Presisi, Skala, dan Panjang (Transact-SQL) tentang char, nchar, nvarchar, dan varchar. Sebaliknya, pengaturan n ke max (tanpa tanda kutip) menyebabkan SQL Server untuk menyimpan (dan mengembalikan) jumlah byte maksimum (seperti yang disebutkan dalam kutipan Anda).

Pertanyaan 2: apakah kueri datareader .net ke kolom ini akan selalu mengembalikan hasil lengkap dengan 100.000 karakter?

Ini adalah pertanyaan .Net (bukan SQL Server), tetapi datareader .Net mengambil aliran byte. Byte bukan karakter, dan SQL Server mengembalikan byte (bukan karakter). Jika n diatur ke 8000 dan tipe data adalah nvarchar, SQL Server mengembalikan hingga 8000 byte, yang dapat ditafsirkan oleh .Net datareader menjadi 4000 karakter Unicode. Jika n diatur ke 8000 dan tipe data adalah varchar, SQL Server mengembalikan hingga 8000 byte, yang dapat ditafsirkan oleh .Net datareader hingga 8000 karakter ANSI. Jika n diatur ke maks dan tipe datanya adalah nvarchar, SQL Server mengembalikan hingga 2 ^ 31-1 byte, yang dapat ditafsirkan oleh datareader .Net hingga (2 ^ 31-1) / 2 karakter. Jika n diatur ke max dan tipe data adalah varchar, SQL Server mengembalikan hingga 2 ^ 31-1 byte, yang dapat ditafsirkan oleh datareader .Net hingga 2 ^ 31-1 karakter ANSI.

Jika Anda memilih menggunakan char atau varchar (bukan nchar atau nvarchar) karena mereka dapat menyimpan lebih banyak "karakter" (lebih akurat: byte), Anda harus menyadari bahwa banyak karakter Unicode tidak memiliki karakter ANSI yang setara (dengan demikian sebagian besar dari kami pengguna dunia tidak akan dapat melihat karakter lokal / asli mereka di aplikasi Anda).

Tagihan
sumber