THE MOMENT, THE MEMENTO

2007年11月27日

Postgresql数据库表名大写的问题

标签:, — 吴德文 @ 16:32

这个学期为了一些应用,用Postgrsql建了数据库,本想正式点,数据库的表名都用大写,比如Users、Profiles、Money等。

可是后来发现,在做select * from Users这样的查询的时候会提示ERROR:  relation "users" does not exist。分析了一下,认为,应该是处理SQL语句的时候把大写的内容都变成小写了,实际的SQL语句变成select * from users——这也说明平时我们可以不用写SELECT * FROM users了,反正都要转换的,哈哈。而Postgresql数据库里表名应该是分大小写的,导致找不到users这个表。

要解决这个问题,就要改SQL语句,所有表名都要加双引号(这个好像也是SQL标准规定的,所有表名、字段名都应该加双引号),select * from "Users"这样就避开了大小写转化的问题。只是这样的话,在一些EJB以及JPA应用里,会带来麻烦。它们在指定Entity使用的是哪个表的时候,往往都要设定表名,通常就是”TABLE NAME”的形式。如果就按默认写法的话,最后在SQL语句里肯定是没有双引号的;如果设定时多加一个双引号上去,就变成双重引号了,当然也许可以’”TABLE NAME”‘即用单引号来包含双引号,但是没有测试不知道是否可行。

最简单的办法,就是数据库里所有的表名都是小写的,最好字段名也都是小写的(因为映射到对象属性以后基本上会变换大小写,JPA是都变成小写)。这样就没与那么多烦恼以及兼容性问题了。人其实都是这样,往往都是自己把事情搞得复杂化的。

注:刚刚发现如果用psql客户端程序创建表的时候,即便表名为大写,实际还是小写的。例如create table Test(),实际得到的表名其实是test。可能使用一些标准化的图形工具的时候,输入的表名,它会用双引号括起来,变成实际的表名是有大小写之分的。


Related:

Valid XHTML 1.1 Valid CSS! Creative Commons License WordPress 所驱动