【问题标题】:MySqlBackup.NET QueryExpress.ExecuteScalarStr() outputs strings enclosed in double-quotes instead of backticksMySqlBackup.NET QueryExpress.ExecuteScalarStr() 输出用双引号而不是反引号括起来的字符串
【发布时间】:2015-08-14 16:58:55
【问题描述】:

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

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

【问题讨论】:

  • 只是为了好奇,你把这个 QueryExpress.ExecuteScalarStr 放在哪里了?
  • 如果您的意思是我从哪里获取的,我从 MySql.Data.MySqlClient.MySqlTable 源代码中获取,它用于执行“SHOW CREATE TABLE...”查询的部分:_createTableSql = QueryExpress.ExecuteScalarStr(cmd, sql, 1)... 你为什么要问?
  • 因为没见过。这意味着它是 MySqlBackup.NET 的一部分,对吧?
  • 我想是的。我对它在 MySql.Data.MySqlClient 命名空间下的事实感到困惑。

标签: c# mysql mysqlbackup.net


【解决方案1】:

这与 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();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 2014-09-26
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多