2014-02-22 68 views
1

我正在将xls/csv文件解析到数据库中。对于每个文件,我都有一个表,其中的列由文件列名称的哈希命名。带有哈希列名的CREATE TABLE语句中的MySQL语法错误

对于列

  • 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 error: [1064: 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 '6e87a4f6ea8244d7e04cb52e495d6693 VARCHAR(255), d9729feb74992cc3482b350163a1a010 ' at line 5] in EXECUTE("CREATE TABLE 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")

我不知道什么是这两个语句的语法之间的差异。请帮忙。

+1

尝试为每个col名称添加反引号。# –

回答

2

你所观察似乎是一个错误。从documentation摘录:

Identifiers may begin with a digit but unless quoted may not consist solely of digits.

的混乱似乎是由于这样的事实:“6e87”是一个有效的数字,即使它并不完全由数字。这是指数表示法。由于某些原因,虽然未加引号的标识符可以以数字开头,但它不能以指数表示法中的数字开头。

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

编辑:

你可以用这两个简单的查询复制问题:

select 6 as 5_1 

select 6 as 5e1 

select 6 as 5f1 

select 6 as 5e1f 

第一和第三工作。第二个正确的失败,因为标识符是一个数字(以指数形式)。最后一次错误地失败。顺便说一下,我认为用数字来启动标识符是一个坏主意,但这与MySQL的行为方式是分开的,与行为记录的方式不同。

+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

+3

可以以数字开头,但文档看起来不正确:_Identifiers可能以数字开头,但除非引用可能不仅仅由数字组成._ http: //dev.mysql.com/doc/refman/5.0/en/identifiers.html它并没有说它们必须被引用,如果它们以一个数字开头,虽然这是发生在这里的事情.http://sqlfiddle.com /#!2/03d6fd –

+0

是的,我知道文档说,但它的错误,我认为,他们无论如何工作。但更好的逃避:) –

+0

MySQL明确地记录并支持以数字开头的未加引号的标识符。看到我的答案。 –

相关问题