为什么postgresql在单引号上失败

MrL*_*ter 0 c# postgresql quoting programmatically-created

我正在尝试以编程方式在安装期间创建postgresql(9.2)"pg_hba.conf"文件.

我试图使用以下内容创建该文件:(
是的,Windows 8.1用户名有空格和撇号)

private static string[] CreatePgHbaContents()
{
    string[] configLines =
        {
            "# TYPE  DATABASE      USER      ADDRESS                   METHOD",
            string.Format("host    all           \"Mi k'e\"        127.0.0.1/32        sspi"),
            string.Format("host    all           \"Mi K'e\"        ::1/128             sspi"),
            "",
            string.Format("host    all           \"SYSTEM\"        127.0.0.1/32        sspi"),
            string.Format("host    all           \"SYSTEM\"        ::1/128             sspi"),
        };

    return configLines;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试创建数据库时收到错误:

[PostgreConfig:878ab49a][2015-06-11T13:00:08.500-07:00][Error][5b4:1]:Npgsql.NpgsqlException:
unterminated quoted string at or near "e')::name);"
Severity: ERROR
Code: 42601
Run Code Online (Sandbox Code Playgroud)

关于如何在配置文件中格式化用户名以允许单引号的任何建议将不胜感激.

Ale*_*lex 5

"e"或其附近的未终止引用字符串是由于PostGres看到单引号并终止该语句.

在将文本输入VARCHAR字段时,我通常用反引号替换单引号(`而不是'),这会阻止它完全删除,但如果引号在用户名中,则它是一个重要字符,因此交换它会打破身份验证.

解决方案是用另一个单引号来逃避单引号.

private static string[] CreatePgHbaContents()
{
    string[] configLines =
        {
            "# TYPE  DATABASE      USER      ADDRESS                   METHOD",
            "host    all           \"Mi k''e\"        127.0.0.1/32        sspi",
            "host    all           \"Mi K''e\"        ::1/128             sspi",
            "host    all           \"SYSTEM\"        127.0.0.1/32        sspi",
            "host    all           \"SYSTEM\"        ::1/128             sspi",
        };

    return configLines;
}
Run Code Online (Sandbox Code Playgroud)

我有点困惑为什么你有一个String.Format.你实际上并没有格式化字符串,所以没有必要.

如果你确实想使用String.format ...

String cleanString = cleanString.Replace("'", "''");
Run Code Online (Sandbox Code Playgroud)