Обсуждение: Using escape strings in an insert statement.
I'm having a little glitch in using escape strings within strings.
The following will best explain my issue:
tester=# create table testing (test_text text);
CREATE TABLE
tester=# insert into testing (test_text) values ('abc\\123');
WARNING: nonstandard use of \\ in a string literal
LINE 1: insert into testing (test_text) values ('abc\\123'); ^
HINT: Use the escape string syntax for backslashes, e.g., E'\\'.
INSERT 0 1
^^^ This works, but I still get an error/warning telling me to use E'\\' - which I do:
tester=# insert into testing (test_text) values ('abcE'\\'123');
Invalid command \. Try \? for help.
tester(#
^^^ And this just doesn't work at all.
The help itself (ch 4.1.2.1) tells me to use double backslash "Thus, to
include a backslash character, write two backslashes (\\). "
Which one is the correct syntax and how can I make it not return
anything other than a successful insert?
Noob question, I know...
But TIA.
(Version is 8.2.3 on Weenblowz if that is of any relevance)
--
Paul Lambert
Database Administrator
AutoLedgers
On Jul 2, 2007, at 17:45 , Paul Lambert wrote:
> tester=# insert into testing (test_text) values ('abcE'\\'123');
This should be
INSERT INTO testing (test_text) values (E'abc\123');
> The help itself (ch 4.1.2.1) tells me to use double backslash
> "Thus, to include a backslash character, write two backslashes (\\). "
Note that the String Constants section (4.1.2.1) says put the E
"before the opening single quote".
http://www.postgresql.org/docs/8.2/interactive/sql-syntax-
lexical.html#SQL-SYNTAX-CONSTANTS
> An escape string constant is specified by writing the letter E
> (upper or lower case) just before the opening single quote, e.g.
> E'foo'.
Also be sure to read the Caution section.
Using \ as an escape character is the old non-standard PostgreSQL
escape syntax that the WARNING (above) is, uh, warning you about.
With standard_conforming_strings on (i.e., follow the SQL spec), the
backslash is just a backslash character.
> Which one is the correct syntax and how can I make it not return
> anything other than a successful insert?
Depends on the setting of standard_conforming_strings.
Michael Glaesemann
grzm seespotcode net
Michael Glaesemann wrote:
>
> On Jul 2, 2007, at 17:45 , Paul Lambert wrote:
>
>> tester=# insert into testing (test_text) values ('abcE'\\'123');
>
> This should be
> INSERT INTO testing (test_text) values (E'abc\123');
>
>> The help itself (ch 4.1.2.1) tells me to use double backslash "Thus,
>> to include a backslash character, write two backslashes (\\). "
>
> Note that the String Constants section (4.1.2.1) says put the E "before
> the opening single quote".
>
> http://www.postgresql.org/docs/8.2/interactive/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS
>
>
Missed that part - my apologies. Time to read the manuals more
thoroughly it would seem.
>> An escape string constant is specified by writing the letter E (upper
>> or lower case) just before the opening single quote, e.g. E'foo'.
>
> Also be sure to read the Caution section.
>
> Using \ as an escape character is the old non-standard PostgreSQL escape
> syntax that the WARNING (above) is, uh, warning you about. With
> standard_conforming_strings on (i.e., follow the SQL spec), the
> backslash is just a backslash character.
>
>> Which one is the correct syntax and how can I make it not return
>> anything other than a successful insert?
>
> Depends on the setting of standard_conforming_strings.
>
> Michael Glaesemann
> grzm seespotcode net
>
Looks like it's a toss-up between turning standard_conforming_strings on
or turning escape_string_warning off, both seem to have the same effect
in not giving the error anymore.
I'll go with your suggestion though, I guess since it's a new install
not a previous upgrade of an old it's technically more correct to
conform to current standards rather than attempt to conform to old behavior.
Cheers for the help - much appreciated.
--
Paul Lambert
Database Administrator
AutoLedgers
On Jul 2, 2007, at 18:26 , Paul Lambert wrote: > Looks like it's a toss-up between turning > standard_conforming_strings on or turning escape_string_warning > off, both seem to have the same effect in not giving the error > anymore. A warning is not an error :) Michael Glaesemann grzm seespotcode net
On Jul 2, 2007, at 6:11 PM, Michael Glaesemann wrote:
>
> On Jul 2, 2007, at 17:45 , Paul Lambert wrote:
>
>> tester=# insert into testing (test_text) values ('abcE'\\'123');
>
> This should be
> INSERT INTO testing (test_text) values (E'abc\123');
No, that will leave him with the string 'abc23' beinginserted, he
wants the backslash to be included in the string, that's why he had
two, so it should be:
INSERT INTO testing (test_text) values (E'abc\\123');
>
>> The help itself (ch 4.1.2.1) tells me to use double backslash
>> "Thus, to include a backslash character, write two backslashes (\
>> \). "
>
> Note that the String Constants section (4.1.2.1) says put the E
> "before the opening single quote".
>
> http://www.postgresql.org/docs/8.2/interactive/sql-syntax-
> lexical.html#SQL-SYNTAX-CONSTANTS
>
>> An escape string constant is specified by writing the letter E
>> (upper or lower case) just before the opening single quote, e.g.
>> E'foo'.
>
> Also be sure to read the Caution section.
>
> Using \ as an escape character is the old non-standard PostgreSQL
> escape syntax that the WARNING (above) is, uh, warning you about.
> With standard_conforming_strings on (i.e., follow the SQL spec),
> the backslash is just a backslash character.
>
>> Which one is the correct syntax and how can I make it not return
>> anything other than a successful insert?
>
> Depends on the setting of standard_conforming_strings.
With standard_conforming_strings turned on, it would just need to be:
INSERT INTO test (test_text) values ('abc\123');
>
> Michael Glaesemann
> grzm seespotcode net
>
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 7: You can help support the PostgreSQL project by donating at
>
> http://www.postgresql.org/about/donate
Erik Jones
Software Developer | Emma®
erik@myemma.com
800.595.4401 or 615.292.5888
615.292.0777 (fax)
Emma helps organizations everywhere communicate & market in style.
Visit us online at http://www.myemma.com
On Jul 3, 2007, at 10:49 , Erik Jones wrote:
> On Jul 2, 2007, at 6:11 PM, Michael Glaesemann wrote:
>
>>
>> On Jul 2, 2007, at 17:45 , Paul Lambert wrote:
>>
>>> tester=# insert into testing (test_text) values ('abcE'\\'123');
>>
>> This should be
>> INSERT INTO testing (test_text) values (E'abc\123');
>
> No, that will leave him with the string 'abc23' beinginserted, he
> wants the backslash to be included in the string, that's why he had
> two, so it should be:
>
> INSERT INTO testing (test_text) values (E'abc\\123');
Ah, right. Thanks for the correction, Erik.
Michael Glaesemann
grzm seespotcode net