当我执行SELECT * FROM tablename时,会生成erorr: java.sql.SQLSyntaxErrorException:表/视图“表名”不存在。 但是如果我运行该sql命令 SELECT * FROM“ tablename” sql运行没有问题,为什么。
答案 0 :(得分:1)
这是SQL标准的一个方面,称为“分隔标识符”。
表名称,列名称和其他对象是您可以在数据库中为其赋予名称的东西。
SQL标准指出,如果您对对象名称的大写/小写不特别了解,则可以仅指定名称而不使用引号,并且数据库将以不区分大小写的方式处理它们(通常,方法是将未加引号的对象名称转换为该名称的全大写形式。
CREATE TABLE mytable(c1 INT, c2 CHAR(10));
INSERT INTO MyTable (C1, C2) VALUES (42, 'Bryan');
SELECT c2 FROM MYTABLE;
由于您没有在引号中指定任何对象名称,因此所有这些示例都可以正常工作,因为mytable
,MyTable
和MYTABLE
在不存在时都相同不能用引号引起来。
但是如果您用引号指定对象名称,那么您必须完全正确:
CREATE TABLE "MyCaseSensitiveTable" (c1 int, c2 char(10));
INSERT INTO MyCaseInsensitiveTable (c1, c2) values (64, 'a nice age');
在这种情况下,您的INSERT
语句将被拒绝,因为"MyCaseSensitiveTable"
与MyCaseSensitiveTable
相比不同。
带分隔符的标识符还具有其他优点:
"TABLE"
的表。我个人不尝试使用定界标识符,因为我认为它们使我的程序难以阅读。但是它们是SQL标准的完全合法部分,并且得到了广泛使用。
但是,最重要的是:如果要将数据库对象名称用引号引起来,则必须始终将它们用引号引起来,并且必须给每次都完全相同,但是如果您不对数据库对象名使用引号,则会以不区分大小写的方式对待它们。