具有哈希列名称的CREATE TABLE语句中的MySQL语法错误

时间:2014-02-22 20:32:59

标签: php mysql

我正在将xls / csv文件解析为数据库。对于每个文件,我有一个表,其列由文件列名称的散列命名。

对于列

  • Nazwisko
  • IMIE
  • Adres1
  • Adres2
  • 斯托
  • 电话
  • KOD
  • 电子邮件
  • Województwo

我有SQL:

CREATE TABLE premium_import_temp_worksheet_9 (
id                       INTEGER NOT NULL AUTO_INCREMENT,
f37c4446e4a882972cd3a80053dd795f VARCHAR(255),
d5bfdd6746ff1a364399acb6e6526b7a VARCHAR(255),
f7e2db7542ea17f0fcc1a46ee21f860b VARCHAR(255),
7161b0ab070daf8e20a2b62f2ef13b81 VARCHAR(255),
4f4e297d754b67e7a104f58b2bcdb850 VARCHAR(255),
0975cf6baccb3862c31522c2b5b8fabc VARCHAR(255),
d1c0419824dea874935502cf6d7c946f VARCHAR(255),
ce8ae9da5b7cd6c3df2929543a9af92d VARCHAR(255),
d7f1213d49993b7ce9ce02463ea1eeda VARCHAR(255),
                 PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci

并且所有内容都没有任何错误地执行,但是对于:

  • 公司名称
  • 电话
  • sffd
  • SDF
  • sdfff

我有:

CREATE TABLE premium_import_temp_worksheet_8 (
id                       INTEGER NOT NULL AUTO_INCREMENT,
e7b47c58815acf1d3afa59a84b5db7fb VARCHAR(255),
bcc254b55c4a1babdf1dcb82c207506b VARCHAR(255),
6e87a4f6ea8244d7e04cb52e495d6693 VARCHAR(255),
d9729feb74992cc3482b350163a1a010 VARCHAR(255),
c90e651df62a9057d9bc8f48b42da7d0 VARCHAR(255),
                 PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci

错误:

  

mysqlt错误:[1064:您的SQL语法有错误;检查   手册,对应右边的MySQL服务器版本   在'6e87a4f6ea8244d7e04cb52e495d6693 VARCHAR(255)附近使用的语法,   EXECUTE(第5行)中的d9729feb74992cc3482b350163a1a010'(“创建表”   premium_import_temp_worksheet_7(id INTEGER NOT NULL AUTO_INCREMENT,   e7b47c58815acf1d3afa59a84b5db7fb VARCHAR(255),   bcc254b55c4a1babdf1dcb82c207506b VARCHAR(255),   6e87a4f6ea8244d7e04cb52e495d6693 VARCHAR(255),   d9729feb74992cc3482b350163a1a010 VARCHAR(255),   c90e651df62a9057d9bc8f48b42da7d0 VARCHAR(255),PRIMARY KEY(id))   ENGINE = InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci“)

我不知道这两个语句的语法有什么区别。请帮忙。

2 个答案:

答案 0 :(得分:2)

你应该通过反叛来逃避

试试这个

   CREATE TABLE premium_import_temp_worksheet_8 (
 id                       INTEGER NOT NULL AUTO_INCREMENT,
 e7b47c58815acf1d3afa59a84b5db7fb VARCHAR(255),
 bcc254b55c4a1babdf1dcb82c207506b VARCHAR(255),
 `6e87a4f6ea8244d7e04cb52e495d6693` VARCHAR(255),
 d9729feb74992cc3482b350163a1a010 VARCHAR(255),
 c90e651df62a9057d9bc8f48b42da7d0 VARCHAR(255),
             PRIMARY KEY (id)
 ) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci

http://sqlfiddle.com/#!2/03d6fd

答案 1 :(得分:2)

您所观察到的似乎是一个错误。摘自documentation

  

标识符可以以数字开头,但除非引用可能不仅仅由数字组成。

混淆似乎是因为“6e87”是有效数字,即使它不完全由数字组成。这是指数表示法。出于某种原因,虽然不带引号的标识符可以以数字开头,但它不能以指数表示法中的数字开头。

通过使用反引号或双引号引用标识符,这很容易修复。

编辑:

您可以使用以下两个简单查询来复制问题:

select 6 as 5_1

select 6 as 5e1

select 6 as 5f1

select 6 as 5e1f

第一和第三项工作。第二个正确失败,因为标识符是一个数字(以指数形式)。最后一次失败错误。 顺便说一句,我认为使用数字启动标识符是一个坏主意,但这与MySQL的行为方式完全相同。