Dize değişmez değerleri
Tek tırnakları '
ikiye katlayarak kaçmak -> ''
standart yoldur ve elbette çalışır:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Eski sürümlerde veya hala standard_conforming_strings = off
veya ile çalışıyorsanız, genellikle, Posix kaçış dizesi sözdiziminiE
bildirmek için dizenizi başa eklerseniz, ters eğik çizgiyle de kaçabilirsiniz :\
E'user\'s log'
Ters eğik çizginin kendisi başka bir ters eğik çizgiyle kaçtı. Ancak bu genellikle tercih edilmez.
Birçok tek tırnak veya birden fazla kaçış katmanı ile uğraşmak zorunda kalırsanız, PostgreSQL'de dolar cinsinden dizelerle cehennemden kaçınabilirsiniz :
'escape '' with '''''
$$escape ' with ''$$
Dolar-kotasyonlar arasında karışıklığı önlemek için, her bir çift için benzersiz bir jeton ekleyin:
$token$escape ' with ''$token$
Hangi sayıda seviye iç içe olabilir:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
$
Karakterin istemci yazılımınızda özel bir anlamı olması gerektiğine dikkat edin . Ayrıca kaçmak zorunda kalabilirsiniz. Psql veya pgAdmin gibi standart PostgreSQL istemcilerinde durum böyle değildir.
Tüm bunlar plpgsql fonksiyonlarını veya geçici SQL komutlarını yazmak için çok kullanışlıdır. Bununla birlikte, kullanıcı girişi mümkün olduğunda uygulamanızda SQL enjeksiyonuna karşı koruma sağlamak için hazırlanmış ifadeler veya başka bir yöntem kullanma ihtiyacını azaltamaz. @ Craig'in cevabı bundan daha fazlasını içeriyor. Daha fazla detay:
Postgres içindeki değerler
Veritabanı içindeki değerlerle uğraşırken, dizeleri doğru şekilde alıntılamak için birkaç yararlı işlev vardır:
quote_literal()
veyaquote_nullable()
- ikincisi NULL
boş girdi için dizeyi çıktılar . ( Geçerli SQL tanımlayıcılarını almak için gerektiğinde dizeleri çift tırnak olarak da quote_ident()
kullanabilirsiniz .)
format()
biçimlendirici %L
ile eşdeğerdir quote_nullable()
.
Sevmek:format('%L', string_var)
concat()
veyaconcat_ws()
iç içe tek tırnak ve ters eğik çizgilerden kaçmadığından genellikle iyi değildir .