我正在将xls / csv文件解析为数据库。对于每个文件,我有一个表,其列由文件列名称的散列命名。
对于列
我有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
并且所有内容都没有任何错误地执行,但是对于:
我有:
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“)
我不知道这两个语句的语法有什么区别。请帮忙。
答案 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
答案 1 :(得分:2)
您所观察到的似乎是一个错误。摘自documentation:
标识符可以以数字开头,但除非引用可能不仅仅由数字组成。
混淆似乎是因为“6e87”是有效数字,即使它不完全由数字组成。这是指数表示法。出于某种原因,虽然不带引号的标识符可以以数字开头,但它不能以指数表示法中的数字开头。
通过使用反引号或双引号引用标识符,这很容易修复。
编辑:
您可以使用以下两个简单查询来复制问题:
select 6 as 5_1
select 6 as 5e1
select 6 as 5f1
select 6 as 5e1f
第一和第三项工作。第二个正确失败,因为标识符是一个数字(以指数形式)。最后一次失败错误。 顺便说一句,我认为使用数字启动标识符是一个坏主意,但这与MySQL的行为方式完全相同。