火鸟默认字符集

Posted

技术标签:

【中文标题】火鸟默认字符集【英文标题】:Firebird default character set 【发布时间】:2012-11-28 01:18:01 【问题描述】:

SQL 选择命令

SELECT a.RDB$CHARACTER_SET_NAME FROM RDB$DATABASE a

返回 NULL。创建新数据库时未指定任何字符集时使用什么字符集? Firebird 的不同版本(1.0、2.0、2.5.1 等)有区别吗?

【问题讨论】:

【参考方案1】:

在创建过程中未指定字符集时,数据库的默认字符集是字符集 NONE,请参阅 Interbase 6.0 数据定义指南的第 47 页(可在 firebird 网站的 documentation section 中找到)。自 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 作为连接字符集还有其他问题。例如列的数据将始终按原样发送,并按接收方式存储,除非列的字符集中不允许字节组合。基本上,这意味着数据库必须在与创建它的语言环境相同的语言环境中使用。

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

【讨论】:

以上是关于火鸟默认字符集的主要内容,如果未能解决你的问题,请参考以下文章

如何在存储过程中拆分逗号分隔的字符串?

火鸟数据阅读器

火鸟与java的连接

如何在火鸟中使用 GROUP BY

德尔福火鸟汽车

如何在不使用火鸟的情况下改进选择