我试图从Linux客户端连接到在Windows中运行的firebird数据库,并且尝试附加数据库时出现以下错误:
bad parameters on attach or create database, CHARACTER SET UTF8 is not defined
我已经在这里搜索并搜索了答案,但似乎找不到解决方案。
关于如何从客户端解决这个问题的任何建议,或者它是否需要使用UTF8支持来重建数据库?
客户端我将node-js与node-firebird模块一起使用,服务器端引擎版本为2.5,ODS版本为11.2
function dbConnect(cb){
fb.attach({
host: '192.168.42.233',
database: 'gi',
user: 'SYSDBA',
password: 'xxxxx'
}, function(err, db){
if (err) console.log(err.message);
else cb(db);
})
}
最佳答案
Harriv的评论促使我测试一下我的想法,认为这可能是由于RDB$CHARACTER_SETS
中缺少条目所引起的。如果我从此系统表中手动删除UTF8
,当我尝试与UTF8
连接时会遇到相同的错误:
SQL Message : -924
Connection error
Engine Code : 335544325
Engine Message :
bad parameters on attach or create database
CHARACTER SET UTF8 is not defined
解决方案是备份数据库,然后再次还原它。这将重新创建
RDB$CHARACTER_SETS
系统表以再次包含UTF8
。请注意,这只会解决
UTF8
中缺少RDB$CHARACTER_SETS
的问题。如果是这样,您首先应该问自己为什么丢失了它。也许是DBA或其他开发人员从RDB$CHARACTER_SETS
中删除了条目,如果这样的话,找出这样做的原因可能是个好主意。例如:也许数据库使用
NONE
作为默认字符集(并针对每一列),并且这是一种确保人们通过删除所有其他选项来仅与“正确的”字符集建立联系的方式(普通的Firebird 2.5数据库在其中包含52个条目) RDB$CHARACTER_SETS
)。如果是这种情况,请确保在连接UTF8
之前已解决此问题,否则您可能会因音译不正确而遭受某种形式的数据损坏(读取或写入时)。解决方法是使用正确的默认字符集(以及列)创建一个新数据库,并将数据从旧的字符集抽取到新的(确保使用适当的字符集完成读写操作)。之后,Firebird可以处理数据库(或列)字符集和连接字符集之间的音译(应用程序使用
NONE
作为连接字符集进行连接的情况除外)。关于node.js - 未定义Firebird CHARACTER SET UTF8,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19285692/