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

SQL Server kembali ??? ketika kolom diperbarui dengan karakter Thailand

Tidak banyak informasi yang diberikan dalam pertanyaan. Yang kita tahu hanyalah:

  • Kolom menggunakan Pengumpulan Thai_CI_AS (setidaknya itu terdengar seperti pertanyaan yang dinyatakan)
  • Karakter Thailand dikirimkan
  • Yang disimpan di kolom adalah:???

Namun, dari itu saja kita dapat menyimpulkan dua hal:

  1. String yang masuk bukan NVARCHAR parameter / variabel, juga bukan literal string yang diawali dengan huruf besar "N",

    dan

  2. Pengumpulan default untuk DB tempat kueri dieksekusi (tidak harus DB tempat Tabel ada) tidak Koleksi Thailand.

Kami tidak tahu apakah kolom tujuan adalah VARCHAR atau NVARCHAR , tapi itu tidak masalah jika Collation kolom adalah Thai Collation (karena itu akan memungkinkan VARCHAR data untuk menampung karakter Thailand, dan NVARCHAR akan bekerja terlepas dari itu).

Jika salah satu :

  • string yang masuk menggunakan NVARCHAR parameter (atau jika string literal, maka awalan dengan huruf besar "N"),

    atau

  • kueri dieksekusi dalam DB yang memiliki Collation default Thailand

maka karakter Thailand akan disimpan seperti yang diharapkan.

Contoh berikut menunjukkan perilaku ini. Saya menggunakan Karakter Thai Khomut U+0E5B pada instance yang memiliki Korean_100_CS_AS_KS_WS_SC Pengumpulan default tingkat instans. Kolom tujuan memiliki Collation Thai_CI_AS . Pertama, sementara DB "saat ini" adalah yang tidak memiliki Collation default Thailand, saya menambahkan karakter dua kali:sekali diawali dengan "N" dan sekali tanpa awalan pada string literal:

USE [tempdb];
-- DROP TABLE #Thai;
CREATE TABLE #Thai (ID INT IDENTITY(1, 1), Col1 VARCHAR(50) COLLATE Thai_CI_AS);

-- In a DB with a non-Thai default Collation:
INSERT INTO #Thai (Col1) VALUES ('๛');
INSERT INTO #Thai (Col1) VALUES (N'๛');

Selanjutnya, saya beralih ke DB yang melakukannya memiliki Collation default Thailand dan hanya memasukkan string yang tidak diawali (tidak perlu menguji ulang string dengan awalan "N"):

USE [other_db];

-- In a DB with a Thai default Collation:
INSERT INTO #Thai (Col1) VALUES ('๛');


SELECT * FROM #Thai;

Hasilnya adalah:

ID  Col1
1   ?
2   ๛
3   ๛

Seperti yang Anda lihat (poin # di bawah ini terkait dengan ID # dalam hasil di atas):

  1. String yang tidak diawali dengan "N", digunakan dalam DB menggunakan Collation default non-Thailand, diterjemahkan ke dalam ?
  2. String dengan awalan "N", juga digunakan dalam DB menggunakan Collation default non-Thailand, menyimpan nilainya dengan benar
  3. String yang tidak diawali dengan "N", digunakan dalam DB yang memiliki Collation default Thailand, menyimpan nilainya dengan benar



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kueri untuk Mengonversi Varchar HH:MM ke Menit Bilangan Bulat di SQL Server 2008

  2. Perhitungan Jarak dengan database SQL Server yang besar

  3. Desain Izin

  4. Cara menangkap pengecualian batas waktu SQLServer

  5. Menganalisis Kinerja I/O untuk SQL Server