2012-12-10 141 views
7

SQL SELECT命令火鳥默認字符集

SELECT a.RDB$CHARACTER_SET_NAME FROM RDB$DATABASE a 

返回null。創建新數據庫時未指定什麼字符集?各種版本的Firebird(1.0,2.0,2.5.1等)之間有什麼區別?

回答

13

創建期間沒有指定字符集時,數據庫的缺省字符集是字符集NONE,請參閱Interbase 6.0數據定義指南(可在Firebird網站的documentation section中獲得)的第47頁。自從Firebird出現以來(可能是因爲創建Interbase之後),它仍然適用於現有的版本。但是,在Firebird 2.5中,當數據庫創建時沒有缺省字符集時,RDB$CHARACTER_SET_NAME將具有值NONE。我不確定這在早期版本中是否有所不同,我的猜測仍然是使用NONE作爲默認值,即使它報告了NULL

如果你想確保,你可以簡單地創建一個不帶字符集規範CHARVARCHAR列一個基本的表格,然後用下面的查詢來確定默認:

SELECT a.RDB$FIELD_NAME, a.RDB$RELATION_NAME, 
     b.RDB$CHARACTER_SET_ID, c.RDB$CHARACTER_SET_NAME 
FROM RDB$RELATION_FIELDS a 
INNER JOIN RDB$FIELDS b 
    ON b.RDB$FIELD_NAME = a.RDB$FIELD_SOURCE 
INNER JOIN RDB$CHARACTER_SETS c 
    ON c.RDB$CHARACTER_SET_ID = b.RDB$CHARACTER_SET_ID 
WHERE RDB$RELATION_NAME = 'TABLE_NAME' 

你可以使用它來查找任何((VAR)CHAR)字段BTW的字符集。

字符集NONE意味着沒有字符集的假設,因此您可以將數據存儲在任何字符集中。但是,您不能將其存儲或與具有明確字符集的列進行比較(除了可能的字符集OCTETS,不確定)。

如果您使用NONE,則需要確保在連接到數據庫時始終使用相同的連接字符集,或者如果使用字符集NONE作爲連接字符集,那麼您的應用程序,驅動程序,訪問組件或編程語言總是使用相同的編碼,否則會出現音譯問題(字符編碼問題)。使用NONE作爲連接字符集有其他問題。例如,列的數據將始終按原樣發送,並按接收的存儲,除非列中字符集中不允許使用字節組合。基本上這意味着數據庫必須在創建它的相同語言環境中使用。

一般來說,最好明確說明默認字符集,除非你知道你在做什麼。