Обсуждение: Backslash problems with 8.1.4
Hello list, I upgraded to postgres-8.1.4 and saw all of the backslash escape changes and understand why, but I can't figure out how to put a literal \' in the database. If \ is no longer escaping shouldn't I be able to use \” and have postgres ignore the \ and use standard sql syntax to escape the single '? It seems that no matter what I try postgres returns an error message because it thinks I'm trying to escape the '. The data is coming from PHP, and yes, I know that embedded SQL is bad, but I want to disable \ escaping now since I don't use it and it will be a little while before I can convert to PDO. Is there any way to disable \ escaping and pass a literal \' without postgres kicking back an error on the query? schu
Matthew Schumacher <matt.s@aptalaska.net> writes:
> I upgraded to postgres-8.1.4 and saw all of the backslash escape changes
> and understand why, but I can't figure out how to put a literal \' in
> the database.
You use the SQL-standard way, which is to repeat the quote mark:
'Meet at Joe''s house'
> The data is coming from PHP,
I have met your problem, and its name is addslashes(). Don't use it.
addslashes is exactly the security hole we are trying to plug.
regards, tom lane
Tom Lane wrote: > Matthew Schumacher <matt.s@aptalaska.net> writes: >> I upgraded to postgres-8.1.4 and saw all of the backslash escape changes >> and understand why, but I can't figure out how to put a literal \' in >> the database. > > You use the SQL-standard way, which is to repeat the quote mark: > 'Meet at Joe''s house' > >> The data is coming from PHP, > > I have met your problem, and its name is addslashes(). Don't use it. > addslashes is exactly the security hole we are trying to plug. > > regards, tom lane Thanks for the reply Tom, however I don't think you understand my issue. I'm not using addslashes and I am using the SQL standard way to escape a single quote. The problem is that I want to put a literal \' inside the database. So if \ is no longer an escape character, and '' is the SQL way to pass a literal ' then you would think that \'' would put a literal \' into the database, however postgres rejects this and spits out an error. So the question isn't how to I escape ', the question is how do I insert a literal \' into a varchar? Thanks, schu
Matthew Schumacher <matt.s@aptalaska.net> writes:
> Thanks for the reply Tom, however I don't think you understand my issue.
> I'm not using addslashes and I am using the SQL standard way to
> escape a single quote. The problem is that I want to put a literal \'
> inside the database. So if \ is no longer an escape character, and ''
> is the SQL way to pass a literal ' then you would think that \'' would
> put a literal \' into the database, however postgres rejects this and
> spits out an error.
Oh, you're mistaken about \ ... it's still an escape character, as of 8.1.
(Beginning in 8.2 there will be a way to make it not an escape.) So
what you need for that is \\'' inside your literal string.
regards, tom lane