Literal string
Melarikan diri dari tanda kutip tunggal '
dengan menggandakannya -> ''
adalah cara standar dan bekerja tentu saja:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Kutipan tunggal biasa (kode ASCII / UTF-8 39), ingatlah, bukan backtick `
, yang tidak memiliki tujuan khusus di Postgres (tidak seperti RDBMS tertentu lainnya) dan bukan tanda kutip ganda "
, digunakan untuk pengidentifikasi.
Dalam versi lama atau jika Anda masih menjalankan dengan standard_conforming_strings = off
atau, umumnya, jika Anda menambahkan string Anda dengan E
untuk mendeklarasikan Sintaks string escape Posix , Anda juga dapat melarikan diri dengan garis miring terbalik \
:
E'user\'s log'
Backslash sendiri diloloskan dengan backslash lain. Tapi itu umumnya tidak lebih baik.
Jika Anda harus berurusan dengan banyak tanda kutip tunggal atau beberapa lapisan melarikan diri, Anda dapat menghindari mengutip neraka di PostgreSQL dengan string yang dikutip dolar :
'escape '' with '''''
$$escape ' with ''$$
Untuk lebih menghindari kebingungan di antara kutipan dolar, tambahkan token unik ke setiap pasangan:
$token$escape ' with ''$token$
Yang dapat disarangkan sejumlah level:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Perhatikan jika $
karakter harus memiliki arti khusus dalam perangkat lunak klien Anda. Anda mungkin harus menghindarinya sebagai tambahan. Ini tidak terjadi pada 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 di aplikasi Anda ketika input pengguna dimungkinkan. @ Jawaban Craig memiliki lebih banyak tentang itu. Selengkapnya:
- Injeksi SQL dalam fungsi Postgres vs kueri yang disiapkan
Nilai di dalam Postgres
Saat berurusan dengan nilai di dalam database, ada beberapa fungsi yang berguna untuk mengutip string dengan benar:
quote_literal()
atauquote_nullable()
- yang terakhir menampilkan stringNULL
untuk masukan nol. (Ada jugaquote_ident()
untuk mengutip dua kali string jika diperlukan untuk mendapatkan pengidentifikasi SQL yang valid .)format()
dengan penentu format%L
setara denganquote_nullable()
.
Seperti:format('%L', string_var)
atauconcat()
biasanya tidak baik untuk tujuan ini seperti yang tidak menghindari tanda kutip tunggal dan garis miring terbalik.concat_ws()