最近更新: 2008-04-28

Oracle 的表格、欄位名稱都要大寫嗎?

jaceju : Oracle 的表格、欄位名稱都要大寫這個限制實在很鳥...不曉得有沒有哪位 Oracle 前輩能指點一二?

關於欄位名稱,其實是可以指定大小寫的,但要用 雙引號 (") 括起來。一個「非雙引號括起的」欄位名稱都要大寫這件事,其實是 SQL Standard。而且這是內定程序。

10)The <identifier body> of a <regular identifier> is equivalent to an <identifier body> in which every letter that is a lower- case letter is replaced by the equivalent upper-case letter or letters. This treatment includes determination of equiva- lence, representation in the Information and Definition Schemas, representation in the diagnostics area, and similar uses. SQL 92

但是 SQL Standard 也允許你用雙引號(doublequote) 字元括起名稱,這時就會抑制大小寫轉換的動作。這是 SQL Standard 配合國際字元集所定的規則。在這種情形下,也 SQL Standard 也允許你用保留字做為欄位名稱。

Oracle 在這方面完全遵循 SQL Standard 。也可以參考 Oracle reference 的內容: Oracle Database SQL Language Reference 11g Release 1::Schema Object Names and Qualifiers。就我個人實際使用經驗, PostgresSQL, MS SQL Server, IBM DB2 以及我最不喜歡的 MySQL方言,都遵循這個作法。

話說回來, MySQL 也是一樣,你把欄位名稱輸入小寫符號,MySQL DBMS內部也是全部轉大寫在處理(還是小寫?我忘了,反正結果一樣)。除非你用雙引號括起來,才會保留大小寫差異。

樂多舊網址: http://blog.roodo.com/rocksaying/archives/5935773.html

樂多舊回應
未留名 (#comment-16312789)
Mon, 28 Apr 2008 18:54:34 +0800
原來是這樣,受教了 :)
我記得之前從MySQL轉到PGSQL的時候,欄位大小寫也以為踩到地雷,結果就自己乖乖的改成小寫(還是大寫,忘了)... :)
未留名 (#comment-16312953)
Mon, 28 Apr 2008 19:41:24 +0800
那個 Oracle SQL Developer 的 Migration 能幫我們加 double A...不對...doublequote 嗎?找半天找不到有關的設定...

我已經快抓狂了...在程式裡的欄位大寫真的很難看...Orz
HACGIS@gmail.com(tokimeki) (#comment-16335635)
Fri, 02 May 2008 13:18:09 +0800
我通常會把欄位的部份轉義出去,所以沒這困擾~
未留名 (#comment-16353951)
Mon, 05 May 2008 16:06:26 +0800
基本上,只有在你自己組成 SQL 敘述的地方才需要動手加上雙引號。其他地方並沒有什麼差別。

例如原本有一段程式是:
$sql = 'SELECT id,name FROM user;';
$db->query($sql);

按 SQL 標準加上雙引號,也不過就只是:
$sql = 'SELECT "id","name" FROM "user";';
$db->query($sql);

這樣就可以在 Oracle 中使用小寫的欄位名稱與表格名稱。這種作法是通式,適用各類支援 SQL 的 DBMS。

而你的程式碼 (如 PHP) 還是一樣不變,如:
$results = $db->query($sql);
$row = $db->fetch($results);
echo $row->id, $row->name;

還有一點,ZendFramework 的 Zend_Db_Select 類可以幫助你處理一些自行組成 SQL 敘述的事。因為 Zend_Db_Select 組成的 SQL 敘述會替欄位名稱和表格名稱加上雙括號。
(Zend_Db_Select 是一種 Active record pattern)

$db->select()->from('user');
就會組成:
SELECT * FROM "user";

如果你用那些 tool ,程式碼不需要改什麼。
未留名 (#comment-16454485)
Sun, 18 May 2008 15:57:31 +0800
SQL 欄位加雙引號真的是標準嗎? MySQL 看起來不支援這個標準 XD

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"user"
LIMIT 0, 30' at line 1
未留名 (#comment-16461157)
Mon, 19 May 2008 18:14:47 +0800
注意看我倒數第二段,我寫「我最不喜歡的 MySQL方言」,原因就在於 MySQL 的內定語法並不符合 SQL標準。

Ok, 言歸正傳,我猜你忘了啟用 ANSI_QUOTES 。
參考 MySQL 5.1 Reference Manual::Schema Object Names: " The identifier quote character is the backtick (“`”).
If the ANSI_QUOTES SQL mode is enabled, it is also allowable to quote identifiers within double quotes"。

注意,MySQL 方言自定的識別字括號是反引號(`),要啟用 ANSI_QUOTES 後,才會支援 ANSI SQL 的雙引號。

MySQL 的文件自己都很明白地寫出它的內定語法其實不符合 ANSI SQL。
未留名 (#comment-16543461)
Thu, 29 May 2008 14:50:50 +0800
大概只有SQLServer用[],其他的DB都是用""
未留名 (#comment-16597579)
Thu, 05 Jun 2008 17:05:51 +0800
其實 SQLServer 也可以用 "" 。

我之前一直都是用 "" 在操作 SQL Server 的資料庫欄位。直到不久前,我查看一位公司同事的內儲程序時,看到一大堆 [] 括起來的名稱,我還真是傻眼。那時我才知道 SQL Server 的書都是教人用 [] 的...

唉唉,那些書籍作者真是誤人子弟。
未留名 (#comment-18208865)
Mon, 22 Dec 2008 16:08:03 +0800
如果MySQL可以用"["及"]"來括起名稱就好了。
其實Open Database Connectivity也是用"`"來括起名稱。