为什么 postgresql 在单引号上失败

本文关键字:失败 单引号 postgresql 为什么 | 更新日期: 2023-09-27 17:55:39

我正在尝试在安装过程中以编程方式创建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;
}

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

[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

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

为什么 postgresql 在单引号上失败

在"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;
}

我有点困惑为什么你有一个String.Format在那里。您实际上并没有格式化字符串,因此没有必要。

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

String cleanString = cleanString.Replace("'", "''");

很可能是转义字符的问题。我建议使用@"以避免任何转义不一致。

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"),
        };