【问题标题】:"Error in your SQL syntax" while creating new table创建新表时出现“SQL 语法错误”
【发布时间】:2014-05-22 18:22:07
【问题描述】:

尝试在 MySQL 中创建表时出现错误。我不知道它是从哪里来的。我认为它可能是一个保留字“名称”,但我将其重命名为 CharName 认为这会有所帮助。有人对此有任何见解吗?

这是我的字符串:

CREATE TABLE xxx.xxx.xxx.xxx_10FEED988A06 (
    `Date`  datetime NOT NULL ,
    `Guid`  varchar(255) NULL ,
    `CharName`  varchar(255) NULL ,
    `Server`  varchar(255) NULL ,
    `CpuId`  varchar(255) NULL ,
    `HardDriveId`  varchar(255) NULL ,
    `MacAddress`  varchar(255) NULL ,
    `IpAddress`  varchar(255) NULL ,
    `MD5`  varchar(255) NULL ,
    PRIMARY KEY (`Date`)
)

这是我的错误:

MySql.Data.MySqlClient.MySqlException (0x80004005): You have an error in your SQL 
syntax; check the manual that corresponds to your MySQL server version for the
 right syntax to use near '70.210.131.54_10FEED988A06 (`Date`  datetime NOT NULL 
 ,`Guid`  varchar(255) NULL' at line 1

这是我的代码:

public static void CreateNonUsersTable()
{
    const string myConString = "Server=" + Server + ";" +
                               "PORT=" + Port + ";" +
                               "DATABASE=" + NonusersDataBase + ";" +
                               "Persist Security Info=No;" +
                               "Convert Zero Datetime=True;" +
                               "Encrypt=True;" +
                               "SslMode=Required;" +
                               "username=" + DbUser + ";" +
                               "password=" + DbPass + ";";

    string createUser = @"CREATE TABLE " + Username + " (" +
                        "`Date`  datetime NOT NULL ," +
                        "`Guid`  varchar(255) NULL ," +
                        "`CharName`  varchar(255) NULL ," +
                        "`Server`  varchar(255) NULL ," +
                        "`CpuId`  varchar(255) NULL ," +
                        "`HardDriveId`  varchar(255) NULL ," +
                        "`MacAddress`  varchar(255) NULL ," +
                        "`IpAddress`  varchar(255) NULL ," +
                        "`MD5`  varchar(255) NULL ," +
                        "PRIMARY KEY (`Date`))";

    Logger.Write(myConString, Enums.LogType.Info);
    Logger.Write(createUser, Enums.LogType.Info);

    using (var conn = new MySqlConnection(myConString))
    {
        conn.Open();
        using (var cmd = new MySqlCommand(createUser, conn))
        {
            try
            {
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Logger.Write(ex.ToString(), Enums.LogType.Exception);
            }
            finally
            {
                cmd.Dispose();
            }
        }
        conn.Close();
        conn.Dispose();
    }
}

【问题讨论】:

  • 有点不相关:如果您的 Username 变量包含用户提供的数据,那么您就有可能面临 SQLI 漏洞。

标签: c# mysql


【解决方案1】:

表名中的. 句点导致错误。见Does MySQL allows to create database with dot?

【讨论】:

    【解决方案2】:

    您不能使用带有点的xxx.xxx.xxx.xxx_10FEED988A06 这样的名称创建表。使用点是非法的表达方式。

    改用下划线_(它们被用作通用约定)。它们的使用是合法的:

    CREATE TABLE xxx_xxx_xxx_xxx_10FEED988A06
    

    请参阅 SQL Fiddle here。

    【讨论】:

      【解决方案3】:

      你必须用反引号来转义你的表名。

      替换这个

        CREATE TABLE xxx.xxx.xxx.xxx_10FEED988A06 
      

      通过

        CREATE TABLE `xxx.xxx.xxx.xxx_10FEED988A06` 
      

      或者最好把.改成其他一些字符,比如_,-

      【讨论】:

      • 我会这样做的。谢谢!这就是我需要的答案!
      • 你不应该那样做...你应该把点改成 _
      【解决方案4】:

      将表名放在反引号中,它应该可以工作。句点搞砸了,因为它们通常用于定义数据库/表组合(例如CREATE TABLE mydb.mytable)

      【讨论】:

      • 感谢您提供的信息!
      猜你喜欢
      • 1970-01-01
      • 2012-04-10
      • 2019-05-03
      • 2021-09-19
      • 1970-01-01
      • 2018-06-14
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多