Kami baru-baru ini memiliki masalah dengan pengkodean yang terkait dengan bidang yang disimpan sebagai varchar (120) di SQL Server. Dalam SSMS, varchar muncul sebagai:
"Siapa yang membunuh JonBen‚t?"
Namun, ketika dibawa ke python, muncul sebagai:
Saya telah meneliti ini dari sisi Python, dan tidak ada yang aneh terjadi. Teori saya adalah bahwa varchar di SQL Server menerima karakter UTF-8 yang menampilkan berbeda dalam python daripada SSMS. Saya tidak terlalu terbiasa dengan pengkodean dalam SQL Server. Dapatkah seseorang tolong beri tahu saya hal berikut:
- Apakah ada cara di SSMS untuk melihat pengkodean varchar? Misalnya, lihat \ x82 alih-alih menampilkan koma seperti saat ini dari SSMS?
- Kami menggunakan SQL Server 2008. Apakah ada cara untuk mengubah pengkodean untuk karakter UTF-8 menjadi karakter ASCII tanpa menggunakan alat impor / ekspor atau membuang ke file datar? Yaitu bisakah saya melakukan konversi ini melalui kueri?
- Apakah ada cara untuk secara sistematis mengidentifikasi catatan yang bermasalah melalui kueri (bermasalah didefinisikan sebagai karakter UTF-8 yang tidak didukung melalui ASCII)?
Terima kasih sebelumnya!
Menggunakan sp_help N'table_name';
saya menemukan bahwa Terbit ini VARCHAR
kolom adalah: SQL_Latin1_General_CP1_CI_AS
.
VARCHAR
digunakan kolom itu?sp_help N'table_name';
. Lihat kolom berdasarkan "nama" dan kemudian lihat kolom "collation_name".Jawaban:
SQL Server tidak menyimpan UTF-8 dalam kondisi apa pun. Anda mendapatkan UTF-16 Little Endian (LE) melalui
NVARCHAR
(termasukNCHAR
danNTEXT
, tetapi jangan pernah menggunakanNTEXT
) danXML
, atau penyandian 8-bit, berdasarkan pada Halaman Kode, melaluiVARCHAR
(termasukCHAR
danTEXT
, tetapi jangan pernah menggunakanTEXT
) .Masalahnya di sini adalah bahwa kode Anda salah menerjemahkan karakter 0x82 itu, berpikir bahwa itu adalah UTF-8, tetapi sebenarnya tidak. Tidak ada "karakter" UTF-8 yang memiliki nilai 0x82, itulah sebabnya Anda mendapatkan simbol "tidak dikenal" / pengganti " ". Silakan lihat tabel UTF-8 berikut ini yang menunjukkan bahwa tidak ada karakter untuk byte tunggal 0x82:
Tabel pengkodean UTF-8
Sebagaimana dinyatakan oleh OP, Collation dari kolom yang dimaksud adalah
SQL_Latin1_General_CP1_CI_AS
, yang berarti bahwa pengkodean 8-bit menggunakan Kode 1252, yang merupakan Windows Latin 1 (ANSI) . Dan memeriksa bagan itu (gulir ke bawah ke bagan bawah karena memiliki nama karakter) nilai 0x82 (cari "82" di kolom "Kode Titik") sebenarnya adalah Tanda Kutip Rendah-9 Tunggal yang Anda lihat di SSMS. Karakter yang, dalam UTF-8, merupakan urutan 3 byte:E2 80 9A
.Apa artinya semua ini: kode Python Anda perlu mengatur pengkodean klien untuk koneksi SQL Server ke Kode Page 1252, atau Anda perlu mengubah / mengubah pengkodean string yang dikembalikan dari Kode Page 1252 ke UTF-8.
Tentu saja, jika ini sedang ditampilkan pada halaman web, maka Anda dapat mengubah charset yang dideklarasikan dari halaman menjadi
Windows-1252
, tetapi itu mungkin mengganggu dengan karakter lain pada halaman jika ada karakter UTF-8 sudah ada di sana.sumber