文章目錄
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之前,必須先將舊的資料庫名和表名轉換為小寫。