Literal string
Meloloskan satu kutipan '
dengan menggandakannya -> ''
adalah cara dan cara standar tentu saja:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Dalam versi lama atau jika Anda masih menjalankan dengan standard_conforming_strings = off
atau, secara umum, jika Anda menambahkan string Anda dengan E
mendeklarasikan sintaks string Posix , Anda juga dapat melarikan diri dengan backslash \
:
E'user\'s log'
Backslash sendiri lolos dengan backslash lain. Tapi itu umumnya tidak disukai.
Jika Anda harus berurusan dengan banyak tanda kutip tunggal atau beberapa lapisan pelolosan, Anda dapat menghindari mengutip neraka di PostgreSQL dengan string yang dikutip dolar :
'escape '' with '''''
$$escape ' with ''$$
Untuk menghindari kebingungan di antara kutipan dolar, lebih lanjut tambahkan token unik untuk setiap pasangan:
$token$escape ' with ''$token$
Yang dapat disarangkan sejumlah level:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Perhatikan jika $
karakter tersebut memiliki makna khusus dalam perangkat lunak klien Anda. Anda mungkin harus menghindarinya juga. Ini tidak terjadi dengan klien PostgreSQL standar seperti psql atau pgAdmin.
Itu semua sangat berguna untuk menulis fungsi plpgsql atau perintah SQL ad-hoc. Itu tidak dapat mengurangi kebutuhan untuk menggunakan pernyataan yang disiapkan atau beberapa metode lain untuk melindungi terhadap injeksi SQL dalam aplikasi Anda ketika input pengguna dimungkinkan. @ Craig menjawab lebih banyak tentang itu. Keterangan lebih lanjut:
Nilai di dalam Postgres
Saat berurusan dengan nilai-nilai di dalam database, ada beberapa fungsi yang berguna untuk mengutip string dengan benar:
quote_literal()
atauquote_nullable()
- yang terakhir menampilkan string NULL
untuk input nol. (Ada juga quote_ident()
untuk double-kutipan string di mana diperlukan untuk mendapatkan SQL yang valid pengidentifikasi .)
format()
dengan format specifier %L
setara dengan quote_nullable()
.
Suka:format('%L', string_var)
concat()
atauconcat_ws()
biasanya tidak baik karena mereka tidak luput dari tanda kutip tunggal dan backslash.