SQL选择命令
SELECT a.RDB$CHARACTER_SET_NAME FROM RDB$DATABASE a
返回 NULL。在创建新数据库时未指定字符集时使用哪种字符集?Firebird 的各个版本(1.0、2.0、2.5.1 等)之间有区别吗?
SQL选择命令
SELECT a.RDB$CHARACTER_SET_NAME FROM RDB$DATABASE a
返回 NULL。在创建新数据库时未指定字符集时使用哪种字符集?Firebird 的各个版本(1.0、2.0、2.5.1 等)之间有区别吗?
创建数据库时如果没有指定字符集,则默认字符集为 NONE
,详见Interbase 6.0数据定义指南第47页(可在firebird网站的文档区找到)。从Firebird之前的版本(可能自Interbase创建以来)就是这样操作的,并且仍适用于现有的版本。但在Firebird 2.5下,如果创建数据库时没有指定默认字符集,则 RDB$CHARACTER_SET_NAME
的值将为 NONE
。我不确定早期版本是否有所不同,但我的猜测仍然是即使报告 NULL
,它也会使用 NONE
作为默认值。
如果你想确定,请简单地创建一个没有字符集规范的基本表格,并使用以下查询确定默认设置:
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
)的字符集。
NONE
字符集表示没有字符集假设,所以你可以在其中存储任何字符集的数据。但是你不能将其存储或与显式字符集的列进行比较(也许除了字符集OCTETS
,对此我不太确定)。
如果你使用了 NONE
,那么当连接到数据库时,你需要确保始终使用相同的连接字符集;如果你使用字符集 NONE
作为连接字符集,则需要确保你的应用程序、驱动程序、访问组件或编程语言始终使用相同的编码方式,否则会出现转换问题(字符编码问题)。
使用 NONE
作为连接字符集也有其他问题。例如,列的数据将始终按原样发送和接收,除非一个字节组合在列的字符集中不允许。基本上它意味着数据库必须在创建它的相同语言环境中使用。
通常最好明确指定默认字符集,除非你知道你在做什么。