MySqlBackup.NET QueryExpress.ExecuteScalarStr()输出用双引号括起来的字符串而不是反引号

时间:2015-08-14 16:58:56

标签: c# mysql mysqlbackup.net

我使用MySqlBackup.dll(MySqlBackup.NET),后者又使用MySql.Data.dll转储数据库。我以为MySqlBackup.NET导致了这种行为,所以我把它从等式中拿出来了。如果我在我的解决方案中运行此代码:

Dim cmd = New MySqlCommand()
        cmd.Connection = New MySqlConnection(connectionString)
        cmd.Connection.Open()
        Dim result = QueryExpress.ExecuteScalarStr(cmd, "SHOW CREATE TABLE `airportcodes`;", 1)
        cmd.Connection.Close()

我得到了

CREATE TABLE "airportcodes" (
  "AirportCodeId" int(11) NOT NULL AUTO_INCREMENT,
  "Code" varchar(4) CHARACTER SET utf8 NOT NULL,
  "AirportName" varchar(100) CHARACTER SET utf8 DEFAULT NULL,
  "Website" varchar(100) CHARACTER SET utf8 DEFAULT NULL,
  "LastUpdate" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY ("AirportCodeId")
)

我无法使用它来恢复,因为它使用双引号。当我同时使用上面的代码和MySqlBackup.NET时会发生这种情况。如果我使用随其源代码提供的MySqlBackup.NET测试应用程序,结果是正确的(使用反引号而不是双引号)。

如果我在mysql CLI中执行此查询,我也会得到正确的版本(带反引号)。我正在使用相同的连接字符串。

创建转储后搜索和替换感觉很愚蠢。可能是什么原因造成的?

1 个答案:

答案 0 :(得分:0)

这与MySqlBackup.NET无关

这是MySql Server的行为,可以将其配置为MySQL服务器的默认(GLOBAL)行为或临时(SESSION)行为。

以下是您可以自己尝试的SQL语句:

示例1:导出带有双引号的表结构:

set session sql_mode=ANSI_QUOTES;
show create table `configkey`;

输出:

CREATE TABLE "configkey" (
  "key" varchar(100) NOT NULL,
  "value" text,
  PRIMARY KEY ("key")
) ENGINE=InnoDB DEFAULT CHARSET=utf8

示例2:导出具有单引号的表结构

set session sql_mode=traditional;
show create table `configkey`;

输出:

CREATE TABLE `configkey` (
  `key` varchar(100) NOT NULL,
  `value` text,
  PRIMARY KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

有关更多信息,请参考以下主题的官方MySQL文档:SQL-MODE https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_sql-mode https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html

如果默认情况下您看到列名称用双引号引起来,则很可能是您的MySQL服务器默认配置为以这种方式做出反应。您可以咨询您的MySQL服务器管理员或提供商。

或者,您可以在执行MySqlBackup.NET之前每次手动配置SQL_MODE。下面是一个示例:

using (MySqlConnection conn = new MySqlConnection(constring))
{
    using (MySqlCommand cmd = new MySqlCommand())
    {
        using (MySqlBackup mb = new MySqlBackup(cmd))
        {
            cmd.Connection = conn;
            conn.Open();

            cmd.CommandText = "set session sql_mode=traditional;";
            cmd.ExecuteNonQuery();

            mb.ExportToFile(file);
            conn.Close();
        }
    }
}