0

我正在使用 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 中执行此查询,我也会得到正确的版本(带有反引号)。我一直在使用相同的连接字符串。

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

4

1 回答 1

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();
        }
    }
}
于 2018-11-20T10:59:01.343 回答