现在的位置: 首页 > 综合 > 正文

转帖:PostgreSQL 数据库对象名大小写敏感

2012年10月24日 ⁄ 综合 ⁄ 共 2700字 ⁄ 字号 评论关闭
文章目录

from: http://bbs.chinaunix.net/viewthread.php?tid=812899

 

因为刚接触pgsql,这个问题搞晕了。

由于 PostgreSQL 是大小写敏感的,并默认对SQL语句中的数据库对象名称转换为小写,因此如果你在创建数据库对象时指定了大小写混和的对象名称,那么在通过SQL语句访问 这些对象时,必须使用双引号(")将数据库对象括起来,以提示 PostgreSQL 不用帮你转换对象名为小写,否则将激发“xxxxx对象不存在”的异常,譬如您的数据库中有名为 TUser 的表,您在 PostgreSQL 自带的图形化查询工具中必须使用类似这样的查询语句才能正确执行:SELECT * FROM "TUser",当然它对 SQL 标准中的保留字和关键字是不区分大小写的,所以写成 select * From "TUser" 这样也是完全可以的。

另外,PostgreSQL 对数据也是大小写敏感的,这点与 SQLServer 不同(SQLServer 默认是不敏感的),譬如在 TUser 表中有字段 Name,其中有一行 Name 字段值为“Tony Tang”的记录,如果直接使用

SELECT * FROM "TUser" WHERE "Name" LIKE '%tony%';
是查询不到这条记录的,不过你可以这么写:

SELECT * FROM "TUser" WHERE UPPER("Name") LIKE '%TONY%';

呵呵,是不是觉得这样不太好看,而且担心性能会受影响?幸好 PostgreSQL 提供了关键字 ILIKE 来帮我们解决这个问题,这真是个非常有趣的关键字(I like),对于第一种写法只需要将 LIKE 替换成 ILIKE 就可以了。

最后,建议在编写 SQL 脚本的时候,使用单引号做字符串常量的标识,虽然在 MS SQLServer 中双引号和单引号均可作为字符串常量的标识符,但是在 PostgreSQL 中对此就有严格的功能区分(不能用双引号作为字符串常量的标识符),为了保险起见,建议对所有的数据库对象名均使用双引号(")将其显式约定,以保证大小 写的严格匹配。

 

 

 

 

 

和PostgreSQL类似,MySQL文档上有如下说明:

 

9.2.2. 识别符大小写敏感性

在MySQL中,数据库对应数据目录中的目录。数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。这说明在大多数Unix中数据库名和表名对大小写敏感,而在Windows中对大小写不敏感。一个显著的例外情况是Mac OS X,它基于Unix但使用默认文件系统类型(HFS+),对大小写不敏感。然而,Mac OS X也支持UFS卷,该卷对大小写敏感,就像Unix一样。参见1.8.4节,“MySQL对标准SQL的扩展”

注释:尽管在某些平台中数据库名和表名对大小写不敏感,不应在同一查询中使用不同的大小写来引用给定的数据库或表。下面的查询不会工作,因为它同时引用了表my_tables和as MY_tables:

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

列、索引、存储子程序和触发器名在任何平台上对大小写不敏感,列的别名也不敏感。

默认情况,表别名在Unix中对大小写敏感,但在Windows或Mac OS X中对大小写不敏感。下面的查询在Unix中不会工作,因为它同时引用了别名a和A:

mysql> SELECT col_name FROM tbl_name AS a
    -> WHERE a.col_name = 1 OR A.col_name = 2;

然而,该查询在Windows中是可以的。要想避免出现差别,最好采用一致的转换,例如总是用小写创建并引用数据库名和表名。在大多数移植和使用中建议使用该转换。

在MySQL中如何在硬盘上保存和使用表名和数据库名由lower_case_tables_name系统变量确定,可以在启动mysqld时设置。lower_case_tables_name可以采用下面的任一值:

含义

0

使用CREATE TABLE或CREATE DATABASE语句指定的大写和小写在硬盘上保存表名和数据库名。名称比较对大小写敏感。在Unix系统中的默认设置即如此。请注意如果在大小写不敏感的文件系统上用--lower-case-table-names=0强制设为0,并且使用不同的大小写访问MyISAM表名,会导致索引破坏。

1

表名在硬盘上以小写保存,名称比较对大小写敏感。MySQL将所有表名转换为小写以便存储和查找。该行为也适合数据库名和表的别名。该值为Windows和Mac OS X系统中的默认值。

2

表名和数据库名在硬盘上使用CREATE TABLE或CREATE DATABASE语句指定的大小写进行保存,但MySQL将它们转换为小写以便查找。名称比较对大小写敏感。注释:在对大小写不敏感的文件系统上适用! InnoDB表名以小写保存,例如lower_case_tables_name=1。

在Windows和Mac OS X中,lower_case_tables_name的 默认值是1。

如果只在一个平台上使用MySQL,通常不需要更改lower_case_tables_name变量。然而,如果你想要在对大小写敏感不同的文件系统的平台之间转移表,会遇到困难。例如,在Unix中,my_tables和MY_tables是两个不同的表,但在Windows中,这两个表名相同。要想避免由于数据库或表名的大小写造成的数据转移问题,可使用两个选项:

·         在任何系统中可以使用lower_case_tables_name=1。使用该选项的不利之处是当使用SHOW TABLES或SHOW DATABASES时,看不出名字原来是用大写还是小写。

·         在Unix中使用lower_case_tables_name=0,在Windows中使用lower_case_tables_name=2。这样了可以保留数据库名和表名的大小写。不利之处是必须确保在Windows中查询总是用正确大小写引用数据库名和表名。如果将查询转移到Unix中,由于在Unix中大小写很重要,如果大小写不正确,它们不工作。

例外:如果你正使用InnoDB表,在任何平台上均应将lower_case_tables_name设置为1,以强制将名转换为小写。

请注意在Unix中将lower_case_tables_name设置为1之前,重启mysqld之前,必须先将旧的数据库名和表名转换为小写。

 

【上篇】
【下篇】

抱歉!评论已关闭.