PostgreSQL转义字符

16

我是新手,想知道如何在where子句的MESSAGE参数中转义RTF语法。

select count(*) 
from communicationoutgoingmessagescheduledetails 
where email='chris.green@waynesreaves.com' 
and message='{\rtf1\deff0{\fonttbl{\f0 Times New Roman;}}{\colortbl\red0\green0\blue0 ;\red0\green0\blue255 ;}{\*\listoverridetable}{\stylesheet {\ql\cf0 Normal;}{\*\cs1\cf0 Default Paragraph Font;}{\*\cs2\sbasedon1\cf0 Line Number;}{\*\cs3\ul\cf1 Hyperlink;}}\splytwnine\sectd\pard\plain\ql{\cf0 first }{\b\cf0 paymen}{\b\cf0 t bold }{\cf0 rem}{\cf0 inder}\par\pard\plain\ql{\ul\cf0 se}{\ul\cf0 cond PAYMENT }{\b\ul\cf0 reminder}\b\ul\par}' 
and succeddful=-1 
and senttime::timestamp::date='2/7/2013 12:00:00 AM'

更新

我遇到的错误如下:

WARNING:  nonstandard use of escape in a string literal LINE 4: and message='{\rtf1\deff0{\fonttbl{\f0 Times New Roman;}}{\c...

HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'. 
ERROR:  invalid Unicode escape LINE 4: and message='{\rtf1\deff0{\fonttbl{\f0 Times New Roman;}}{\c...

HINT:  Unicode escapes must be \uXXXX or \UXXXXXXXX.
********** Error **********

ERROR: invalid Unicode escape SQL state: 22025 Hint: Unicode escapes must be \uXXXX or \UXXXXXXXX. Character: 124

更新 2

这是我执行的代码,用于从 PostgreSQL 获取结果集:

string sql = "select count(*) from communicationoutgoingmessagescheduledetails " +
                        "where email='" + email + "' ";

        if (message != string.Empty)
            sql += String.Format("and message='{0}' ", message);

        if (subject != string.Empty)
            sql += String.Format("and subject='{0}' ", subject);

        sql += "and successful=true " +
        "and senttime::timestamp::date='" + date.Date + "'";


        System.Data.IDbConnection connection = ORGen.Access.Config.Instance.Connection;
        IDbCommand command = connection.CreateCommand();

        connection.Open();
        command.CommandText = sql;
        bool retVal = Convert.ToInt16(command.ExecuteScalar()) > 0 ? true : false;
        connection.Close();

        command = null;
        connection = null;

始终提及您的PostgreSQL版本,以及您用于发送SQL的语言。 - Craig Ringer
抱歉。PostgreSQL 9.0.4和C#.Net。 - ChampChris
1个回答

26

在 PostgreSQL 9.3 或更新版本上,如果没有手动更改 standard_conforming_strings 设置,则无需转义任何内容,除了单引号外,单引号需要做如下双倍处理:

'this is a single quote: ''. '

如果您使用的是较早版本,可以在postgresql.conf中设置standard_conforming_strings为on,或者使用双反斜杠并使用E''字符串表示法。
E'{\\rtf1'

这些都在用户手册的词法结构部分中得到解释

然而,你应该使用您所用语言的PostgreSQL客户端驱动程序来发送参数化语句(parameterized statements),它会自动处理转义。如果不这样做,可能会导致SQL注入攻击(SQL injection) - 请参见此网站

由于您正在使用带有npgsql的C#,因此您可能需要http://bobby-tables.com/csharp.html。更多详细信息请参见npgsql用户手册


3
如果使用像$$this is a single quote: '.$$这样的美元符号引用,在现代PostgreSQL中就不需要转义单引号。 - Clodoaldo Neto
1
请问您能否定义一下“现代”的版本号,比如说超过某个版本号? - wligtenberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接