Rumah >pangkalan data >tutorial mysql >Mengapa NVARCHAR(MAX) Masih Memotong Rentetan Saya dalam Pelayan SQL?

Mengapa NVARCHAR(MAX) Masih Memotong Rentetan Saya dalam Pelayan SQL?

Linda Hamilton
Linda Hamiltonasal
2025-01-06 20:15:41383semak imbas

Why Does NVARCHAR(MAX) Still Truncate My Strings in SQL Server?

"Pemotongan NVARCHAR(MAX) Masih Berlaku: Memahami Penukaran Tersirat"

Walaupun terdapat tanggapan salah bahawa NVARCHAR(MAX) dalam versi SQL Server moden memegang data yang besar, pengguna mungkin menghadapi pemotongan kepada 4000 aksara seperti dalam ini contoh:

DECLARE @Query NVARCHAR(max);
SET @Query = 'SELECT...' -- some of the query gets set here
SET @Query = @Query + '...' -- more query gets added on, etc.

-- later on...
PRINT LEN(@Query) -- Prints out 4273, which is correct as far as I can tell
PRINT @Query      -- Truncates value to 4000 characters
EXEC sp_executesql @Query -- totally crashes due to malformed (truncated) query

Punca Punca: Penukaran Tersirat

Isu ini berpunca daripada penukaran tersirat. Apabila menggabungkan rentetan dengan aksara Unicode, SQL Server secara automatik menukar keputusan kepada NVARCHAR(4000) tanpa amaran atau tanda pemotongan. Ini berlaku walaupun apabila pembolehubah yang diisytiharkan untuk menyimpan hasilnya ialah NVARCHAR(MAX).

Penyelesaian: Menguatkuasakan Penukaran Eksplisit

Untuk mengelakkan penukaran tersirat dan memastikan pengekalan besar data, sentiasa pra-gabungkan menggunakan CAST:

SET @Query = CAST('' as nVarChar(MAX)) -- Force implicit conversion to nVarChar(MAX)
           + 'SELECT...' -- some of the query gets set here
           + '...' -- more query gets added on, etc.

Dengan menghantar rentetan kosong ke NVARCHAR(MAX), SQL Server secara eksplisit diarahkan untuk mengendalikan keseluruhan rentetan sebagai NVARCHAR(MAX). Ini menghapuskan isu pemangkasan.

Pertimbangan Lain

  • Elakkan rentetan literal yang lebih panjang daripada 4000 aksara (atau 8000 untuk VarChar) untuk mengelakkan pemotongan.
  • Pecahkan rentetan yang besar kepada bahagian yang lebih kecil untuk memastikan kejayaan penyatuan.

Atas ialah kandungan terperinci Mengapa NVARCHAR(MAX) Masih Memotong Rentetan Saya dalam Pelayan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn