为什么postgresql在单引号上失败
Why does postgresql fail on single quote
我试图在安装过程中以编程方式创建 postgresql (9.2) "pg_hba.conf" 文件。
我尝试使用以下方法创建文件:
(是的,Windows 8.1 用户名有一个 space 和一个撇号)
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
任何有关如何在配置文件中格式化用户名以允许单引号的建议,我们将不胜感激。
“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"),
};
我试图在安装过程中以编程方式创建 postgresql (9.2) "pg_hba.conf" 文件。
我尝试使用以下方法创建文件:
(是的,Windows 8.1 用户名有一个 space 和一个撇号)
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
任何有关如何在配置文件中格式化用户名以允许单引号的建议,我们将不胜感激。
“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"),
};