今天create一個表的時候, 欄位加了引號,結果select 該欄位的時候告訴欄位找不著,樣本如下:
SQL> create table test("id" varchar2(10));Table created.SQL> desc test; Name Null? Type ----------------------------------------- -------- ---------------------------- id VARCHAR2(10)SQL> insert into test values('1');1 row created.SQL> commit;Commit complete.SQL> select id from test;select id from test *ERROR at line 1:ORA-00904: "ID": invalid identifierSQL> select "id" from test;id----------1SQL> select * from test;id----------1SQL>
經反覆實驗,如果建表時欄位不加引號,則無論怎麼查詢都不會出現上述問題,後證明是大小寫問題. 繼續實驗:
SQL> create table test(id varchar2(10));Table created.SQL> desc test Name Null? Type ----------------------------------------- -------- ---------------------------- ID VARCHAR2(10)SQL> insert into test values('2'); 1 row created.SQL> commit;Commit complete.SQL> select id from test;ID----------2SQL> select ID from test;ID----------2SQL> select * from test;ID----------2SQL> select "id" from test;select "id" from test *ERROR at line 1:ORA-00904: "id": invalid identifierSQL> select "ID" from test;ID----------2SQL>
具體如下:
id=ID="ID" 第1個id預設轉換成大寫ID, 第二個ID也預設轉換成大寫ID, 第三個不作轉換, 由於引號引住,本身就是大寫, 所以三個相等.
≠ (上面一行不等於下面一行)
"id"="id" 第1個"id"由於是引號引住,並且是小寫, 所以引用該欄位時只能用"id"引用,其它任何形式都會報錯.
結論: oracle 的欄位, 在不加引號時, 全部預設轉換成大寫.
加引號時, 則不會自動轉換, 寫成什麼樣就是什麼樣, 在引用該欄位時,如果大小寫不匹配則報錯 ORA-00904: "id": invalid identifier
由於存在上述特性,則可能出現2個欄位名稱一樣的現象, 如下:
SQL> drop table test;Table dropped.SQL> create table test("id" varchar2(10), id varchar2(10));Table created.SQL> desc test; Name Null? Type ----------------------------------------- -------- ---------------------------- id VARCHAR2(10) ID VARCHAR2(10)SQL> insert into test values('3','3');1 row created.SQL> select * from test;id ID---------- ----------3 3