【问题标题】:Java DB / Derby - white space in table name - how to escape?Java DB / Derby - 表名中的空格 - 如何转义?
【发布时间】:2013-08-07 16:55:35
【问题描述】:

Java DB / Derby - 表(列)名称中的空格 - 如何转义?在 MySQL 数据库中,它只是由 ``(重音)转义,但如果我尝试执行查询(Java DB),例如:

CREATE TABLE `etc etc` (ID INT PRIMARY KEY, Title VARCHAR(12))

我得到错误:

java.sql.SQLSyntaxErrorException:第 1 行第 14 列出现词法错误。 遇到:“`”(96),后:“”。

有什么解决办法吗?

已编辑:

确实感谢您提供全面的答案。我发现了有趣的东西(Java DB):

可以这样创建表:

CREATE TABLE "etc etc" (ID INT PRIMARY KEY, Title VARCHAR(12))

稍后才能得到结果:

SELECT * FROM "etc etc"

但如果我创建这样的表(没有空格和引号):

CREATE TABLE etc_etc (ID INT PRIMARY KEY, Title VARCHAR(12))

然后得到这样的结果(带双引号,只是举例,它们并不真正需要):

SELECT * FROM "etc_etc"

我得到错误:

java.sql.SQLSyntaxErrorException: 表/视图 'etc_etc' 不存在。

所以我的结论是,如果在创建表时使用了引号(名称是否包含空格并不重要),稍后在获取结果时,也应该使用引号。反之亦然(在这种情况下当然没有空格)。

我同意最好不要使用空格,而是使用_ 字符。但我喜欢 MySQL 上的那些重音字符...

【问题讨论】:

  • 一般人不会在表名中使用空格,他们更喜欢_ 字符...是什么让您决定使用空格?
  • 您是否尝试过使用" 作为转义字符? CREATE TABLE "etc etc" (ID INT PRIMARY KEY, Title VARCHAR(12))
  • 这正是我在回答中所说的:使用带引号的标识符使其区分大小写(根据 SQL 标准的要求)。

标签: sql derby javadb


【解决方案1】:

SQL 标准要求使用双引号来引用标识符,这些标识符要么是保留字,要么是使用标识符中不允许的字符。请注意,MySQL 通过使用可怕的反引号 ` 简单地忽略了标准 - 但它可以(我认为应该)配置为也允许标准双引号(就像所有其他 DBMS 一样)。

所以你的陈述应该是这样的:

CREATE TABLE "etc etc" (ID INT PRIMARY KEY, Title VARCHAR(12));

请注意,使用“带引号的标识符”(或“分隔标识符”)也会使名称区分大小写"etc etc" 是与 "Etc Etc" 不同的表名。因此,在创建了上述表格后,您总是必须将名称写成小写。

最好的办法是完全避免引用标识符。因此,在您的情况下,您可能应该选择 etc_etc 作为名称,使用下划线在视觉上分隔两个单词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 2013-12-07
    • 2017-07-27
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2010-09-15
    相关资源
    最近更新 更多