CHR(0)
adalah karakter yang digunakan untuk mengakhiri string dalam bahasa pemrograman C (antara lain).
Saat Anda melewati CHR(0)
ke fungsi itu, pada gilirannya, akan meneruskannya ke fungsi tingkat yang lebih rendah yang akan mengurai string yang telah Anda lewati dan membangun pola ekspresi reguler dari string itu. Pola ekspresi reguler ini akan melihat CHR(0)
dan anggap itu adalah terminator string dan abaikan sisa polanya.
Perilaku lebih mudah dilihat dengan REGEXP_REPLACE
:
SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
FROM DUAL;
Apa yang terjadi ketika Anda menjalankan ini:
CHR(0)
dikompilasi menjadi ekspresi reguler dan menjadi terminator string.- Sekarang polanya hanyalah terminator string dan polanya adalah string dengan panjang nol.
- Ekspresi reguler kemudian dicocokkan dengan string input dan membaca karakter pertama
a
dan menemukan string panjang nol dapat dicocokkan sebeluma
jadi itu menggantikan yang tidak cocok sebeluma
dengand
memberikan outputda
. - Ini kemudian akan diulang untuk karakter berikutnya yang mengubah
b
kedb
. - dan seterusnya hingga Anda mencapai akhir string ketika itu akan cocok dengan pola panjang nol dan menambahkan
d
akhir .
Dan Anda akan mendapatkan output:
dadbdcd_ded
(di mana _ adalah CHR(0)
karakter. )
Catatan:CHR(0)
di input tidak diganti.
Jika program klien yang Anda gunakan juga memotong string di CHR(0)
Anda mungkin tidak melihat seluruh output (ini adalah masalah dengan bagaimana klien Anda merepresentasikan string dan bukan dengan output Oracle) tetapi juga dapat ditampilkan menggunakan DUMP()
:
SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
FROM DUAL;
Keluaran:
Typ=1 Len=11: 100,97,100,98,100,99,100,0,100,101,100
[TL;DR] Jadi apa yang terjadi dengan
REGEXP_LIKE( '1234567890', CHR(0) )
Ini akan membuat pola ekspresi reguler string panjang nol dan akan mencari kecocokan panjang nol sebelum 1
karakter - yang akan ditemukan dan kemudian mengembalikan bahwa ia telah menemukan kecocokan.