我试图连接到从Linux客户端在Windows中运行的firebird数据库,并且当试图附加数据库时,我收到以下错误:
bad parameters on attach or create database, CHARACTER SET UTF8 is not defined
Run Code Online (Sandbox Code Playgroud)
我在谷歌搜索并搜索了答案,但似乎无法找到解决方案.
有关如何从客户端克服此问题的任何建议,还是需要使用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);
})
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
解决办法是备份数据库并重新恢复。这将重新创建RDB$CHARACTER_SETS系统表以再次包含UTF8。
请注意,这只能解决您的问题(如果UTF8缺少)RDB$CHARACTER_SETS。如果确实如此,您应该首先问自己为什么它丢失了。也许 DBA 或其他开发人员从 中删除了条目RDB$CHARACTER_SETS,如果是这样,找出这样做的原因可能是个好主意。
例如:也许数据库使用NONE默认字符集(并且对于每一列),这是一种通过删除所有其他选项来确保人们仅与“正确”字符集连接的方法(普通的 Firebird 2.5 数据库包含 52 个条目RDB$CHARACTER_SETS) 。如果是这种情况,请确保在连接之前解决此问题UTF8,否则您可能会因不正确的音译而遇到某种形式的数据损坏(在读取或写入时)。
解决此问题的方法是创建一个具有正确默认字符集(以及列)的新数据库,并将数据从旧数据库泵送到新数据库(确保使用适当的字符集完成读写)。NONE之后,Firebird 可以负责数据库(或列)字符集和连接字符集之间的音译(使用连接字符集进行连接的应用程序除外)。