2012-12-10 36 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作为连接字符集有其他问题。例如,列的数据将始终按原样发送,并按接收的存储,除非列中字符集中不允许使用字节组合。基本上这意味着数据库必须在创建它的相同语言环境中使用。

一般来说,最好明确说明默认字符集,除非你知道你在做什么。