Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Batas SQL NVARCHAR dan VARCHAR

Saya mengerti bahwa ada set maksimum 4000 untuk NVARCHAR(MAX)

Pemahaman Anda salah. nvarchar(max) dapat menyimpan hingga (dan terkadang lebih) data 2 GB (1 miliar karakter bita ganda).

Dari nchar dan nvarchar di Buku online tata bahasanya adalah

nvarchar [ ( n | max ) ]

| karakter berarti ini adalah alternatif. yaitu Anda menentukan salah satu n atau max literal .

Jika Anda memilih untuk menentukan n . tertentu maka ini harus antara 1 dan 4,000 tetapi menggunakan max mendefinisikannya sebagai tipe data objek besar (pengganti ntext yang tidak digunakan lagi).

Sebenarnya di SQL Server 2008 tampaknya untuk variabel batas 2GB dapat dilampaui tanpa batas dengan ruang yang cukup di tempdb (Tampil di sini)

Mengenai bagian lain dari pertanyaan Anda

Pemotongan saat menggabungkan bergantung pada tipe data.

  1. varchar(n) + varchar(n) akan dipotong menjadi 8.000 karakter.
  2. nvarchar(n) + nvarchar(n) akan dipotong menjadi 4.000 karakter.
  3. varchar(n) + nvarchar(n) akan terpotong pada 4.000 karakter. nvarchar memiliki prioritas lebih tinggi sehingga hasilnya adalah nvarchar(4,000)
  4. [n]varchar(max) + [n]varchar(max) tidak akan terpotong (untuk <2 GB).
  5. varchar(max) + varchar(n) tidak akan terpotong (untuk <2GB) dan hasilnya akan diketik sebagai varchar(max) .
  6. varchar(max) + nvarchar(n) tidak akan terpotong (untuk <2GB) dan hasilnya akan diketik sebagai nvarchar(max) .
  7. nvarchar(max) + varchar(n) pertama-tama akan mengonversi varchar(n) masukan ke nvarchar(n) dan kemudian melakukan penggabungan. Jika panjang varchar(n) string lebih besar dari 4.000 karakter, pemerannya akan menjadi nvarchar(4000) dan pemotongan akan terjadi .

Tipe data string literal

Jika Anda menggunakan N awalan dan string <=4,000 karakter akan diketik sebagai nvarchar(n) dimana n adalah panjang tali. Jadi N'Foo' akan diperlakukan sebagai nvarchar(3) Misalnya. Jika string lebih panjang dari 4.000 karakter, itu akan diperlakukan sebagai nvarchar(max)

Jika Anda tidak menggunakan N awalan dan string <=8.000 karakter akan diketik sebagai varchar(n) dimana n adalah panjang tali. Jika lebih panjang sebagai varchar(max)

Untuk kedua hal di atas jika panjang string adalah nol maka n disetel ke 1.

Elemen sintaks yang lebih baru.

1. CONCAT fungsi tidak membantu di sini

DECLARE @A5000 VARCHAR(5000) = REPLICATE('A',5000);

SELECT DATALENGTH(@A5000 + @A5000), 
       DATALENGTH(CONCAT(@A5000,@A5000));

Di atas mengembalikan 8000 untuk kedua metode penggabungan.

2. Hati-hati dengan +=

DECLARE @A VARCHAR(MAX) = '';

SET @A+= REPLICATE('A',5000) + REPLICATE('A',5000)

DECLARE @B VARCHAR(MAX) = '';

SET @B = @B + REPLICATE('A',5000) + REPLICATE('A',5000)


SELECT DATALENGTH(@A), 
       DATALENGTH(@B);`

Kembali

-------------------- --------------------
8000                 10000

Perhatikan bahwa @A mengalami pemotongan.

Cara mengatasi masalah yang Anda alami.

Anda mendapatkan pemotongan baik karena Anda menggabungkan dua non max tipe data bersama-sama atau karena Anda menggabungkan varchar(4001 - 8000) string ke nvarchar string yang diketik (bahkan nvarchar(max) ).

Untuk menghindari masalah kedua, cukup pastikan bahwa semua literal string (atau setidaknya yang memiliki panjang dalam rentang 4001 - 8000) diawali dengan N .

Untuk menghindari masalah pertama, ubah tugas dari

DECLARE @SQL NVARCHAR(MAX);
SET @SQL = 'Foo' + 'Bar' + ...;

Untuk

DECLARE @SQL NVARCHAR(MAX) = ''; 
SET @SQL = @SQL + N'Foo' + N'Bar'

sehingga NVARCHAR(MAX) terlibat dalam rangkaian dari awal (sebagai hasil dari setiap rangkaian juga akan menjadi NVARCHAR(MAX) ini akan menyebar)

Menghindari pemotongan saat melihat

Pastikan Anda telah memilih mode "hasil ke kisi" agar Anda dapat menggunakan

select @SQL as [processing-instruction(x)] FOR XML PATH 

Opsi SSMS memungkinkan Anda menyetel panjang tak terbatas untuk XML hasil. processing-instruction bit menghindari masalah dengan karakter seperti &lt; muncul sebagai &lt; .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Keterbatasan SQL Server Express

  2. Bagaimana saya bisa mendapatkan daftar nama elemen dari nilai XML di SQL Server

  3. Bekerja dengan Data Salesforce.com di Layanan Pelaporan SQL Server

  4. Pengelompokan SQL berdasarkan bulan dan tahun

  5. Dapatkan catatan bulan lalu di SQL server