火鸟数据库默认字符集

10

SQL选择命令

SELECT a.RDB$CHARACTER_SET_NAME FROM RDB$DATABASE a

返回 NULL。在创建新数据库时未指定字符集时使用哪种字符集?Firebird 的各个版本(1.0、2.0、2.5.1 等)之间有区别吗?

1个回答

19

创建数据库时如果没有指定字符集,则默认字符集为 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 作为连接字符集也有其他问题。例如,列的数据将始终按原样发送和接收,除非一个字节组合在列的字符集中不允许。基本上它意味着数据库必须在创建它的相同语言环境中使用。

通常最好明确指定默认字符集,除非你知道你在做什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接