Apa cara terbaik untuk memeriksa apakah bidang VARCHAR memiliki Karakter Non-Ascii?
CHAR(1)
melalui CHAR(31)
dan CHAR(127)
melalui CHAR(255)
.
Saya mencoba menggunakan PATINDEX
dan mengalami masalah berikut.
Memeriksa kisaran bawah bekerja dengan benar.
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0
Data saya memiliki tiga catatan dengan 0x1E dan ketiganya dikembalikan.
Tetapi ketika saya memeriksa hanya kisaran atas:
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0
Ini mengembalikan dekat dengan semua catatan dalam tabel (jumlah tabel 170737 dan kembali menghitung 170735) dan karena data saya tidak memiliki nilai dalam kisaran ini saya akan berpikir itu seharusnya tidak mengembalikan catatan.
sql-server
sql-server-2008-r2
t-sql
Gerhard Weiss
sumber
sumber
Jawaban:
Kisaran dalam sintaksis pola menggunakan aturan penyortiran dari koleksi Anda.
Gunakan klausa susun biner sehingga rentang dipesan oleh kode karakter.
(Saya juga mengubahnya menjadi
LIKE
karena saya menemukan itu lebih jelas daripadaPATINDEX > 0
)sumber
Jika Anda seperti saya dan Anda sudah lelah selama bertahun-tahun mencari karakter ini dalam data mengerikan perusahaan Anda, Anda dapat menggunakan fungsi ini atau menulis ulang untuk tujuan Anda sendiri. Ini memang bertele-tele, tetapi ini merupakan langkah ekstra mengidentifikasi karakter-karakter khusus jika Anda mau - garis komentar 19 - 179 untuk melakukannya.
Jika string tidak mengandung nilai ascii yang tidak dapat dicetak atau diperluas - ia mengembalikan NULL.
Dan kemudian, menyebutnya seperti:
Output sampel:
Atau
sumber