length() between oracle and postgresql

babyyellow發表於2011-09-06
在讀pg的doc 的時候, value  storage 的時候順手測試了一下示例資料,結果就出問題了

PostgreSQL:digoal=> create table char_test(info char(20));
CREATE TABLE
digoal=> insert into char_test  values ('abcdef');
INSERT 0 1
digoal=> select info,length(info) from char_test ;
         info         | length 
----------------------+--------
 abcdef               |      6
(1 row)

而 doc 文件裡的結果為 length 為 20 

難道是文件錯誤??

在oracle 裡做了測試確實是20 。




Oracle:
SQL> create table char_test (info char(20));
Table created.
SQL> insert into char_test values ('abcdef');
1 row created.
SQL> select info,length(info) from char_test;
INFO                 LENGTH(INFO)
-------------------- ------------
abcdef                         20


一時很鬱悶!!

找找資料解決問題: 

看看兩個資料庫的函式解釋。
Oracle :
The LENGTH functions return the length of char. LENGTH calculates length using characters as defined by the input character set.
If char has datatype CHAR, then the length includes all trailing blanks. If char is null, then this function returns null.


PostgreSQL : 
length : Number of characters in string
顯然PostgreSQL未計算blank字元的長度.
再看看PostgreSQL的HISTORY檔案 : 確實有類似改動。
HISTORY:     * Add array_length() to return the length of an array for a specified
HISTORY:     * The length() function no longer counts trailing spaces in CHAR(n)
HISTORY:     * Make length() disregard trailing spaces in CHAR(n) (Gavin)
HISTORY:       counted by length().
HISTORY:     * The function "octet_length()" now returns the uncompressed data
HISTORY:     * New function bit_length() (Peter E)
HISTORY:     * Add pg_database_encoding_max_length() (Tatsuo)
HISTORY:Make char_length()/octet_length including trailing blanks (Tom)



問題終於搞清楚了 文件錯誤了

我順便在文件裡新增了一個comment  把pg 的history 加上了,這回不會誤導人了。 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-706772/,如需轉載,請註明出處,否則將追究法律責任。

相關文章