firebird中文字符集问题 malformed string问题



fb默认采用none字符集建库,这其实不是任何字符集,它对字符串当二进制流(数组)处理。由于字符编码原因,有时我们想查找 “%王%” 也许结果中出现一些并没有 王 的数据(排序也是一样道理,也许数据次序有些怪异)。另外,在字符存储时,数据库也不对字符串进行任何校验(我们知道,字符集的校验是一种正确性检查),这回导致存入的字符串可以包括任何编码(似乎满足灵活性需要),但问题是你取出字符串时却没法知道它的字符集而导致可能不正确还原出现乱码。


none也不是恐惧的问题。按白猫黑猫实用主义对系统和开发员也挺务实。只是要明白潜在问题以及解决方法。fb的数据库字符集好像是不能改的。所以可能需要看看高版本是否解决这个问题或自己动手写个数据迁移工具在两个不同字符集数据库中导数据。

简体中文windows是缺省文件以及输入编码是gbk。但如果你的程序是web方式的或有linux客户端情况就稍复杂些,因为web以及linux的对中文可能采用utf编码,这样会造成显示乱码或错误查询结果。如果数据库设置了gbk,数据库端会校验输出中文,会拒绝utf的汉字输入(malformed string),也给你及时提醒编码需要设置正确。

如何设置编码有两部分:
1、数据库字符编码。这个比较简单,建库语句里设置。
2、数据库客户端连接时编码选择。具体设置这和你选择的连接方式有关。比如java
jdbc:firebirdsql://localhost//home/databases/sample.gdb?lc_ctype=gb2312

连接的编码是告诉服务器,该客户端的字符串编码。所以简体windows客户端是gb2312/gbk,但如果你的数据库设置是none就没有必要告诉服务器了。





Malformed string


If you see this error, it usually means the the client is not able to transform the string you wrote to the character set acceptable to the Firebird server. Here's a short explanation how this works:

In your client program, you type in some text, which is then shown on the screen. This text has the same character set like the rest of your environment. Typically it is UTF8 on Linux, and various WIN-xxxx charset on Windows (WIN-1252 in Western Europe, WIN-1250 in Eastern Europe, etc.).

Your client tool should then transliterate this to the connection character set of your Firebird connection, and the Firebird server transliterates that to the character set of the actual columns when it stores the string into the database. If your client tool is not 'smart' enough to do the transliteration, you should set the connection character set to be the same as your environment character set. For example, if you're using isql and have a West-Europe Windows, you should type this at the beginning of your isql session:

SET NAMES WIN1252;

With this, you can even work with UTF8 databases while using isql. Some tools (like, for example, FlameRobin) are more advanced and do the needed transliteration for you, so you can use some other character set for connection (for example UTF8) without problems.


Firebird数据库是一个流行的开源关系型数据库管理系统,它支持多种字符集,包括中文字符集。如果在Firebird查询中出现中文乱码的情况,可能是由于以下原因造成的: 1. 数据库或表的字符集设置不正确:在创建数据库或表的时候,需要正确设置字符集为支持中文字符集,如UTF-8或GBK。如果字符集设置不正确,查询中的中文字符就会显示乱码。 2. 数据库连接字符集设置错误:在使用Firebird连接数据库时,需要正确设置连接字符集。如果连接字符集数据库或表的字符集不一致,查询结果中的中文字符就会出现乱码。 解决上述问题的方法: 1. 确保数据库或表的字符集正确设置为支持中文字符集,如UTF-8或GBK。可以通过修改数据库或表的字符集来解决。 2. 确保数据库连接字符集数据库或表的字符集一致。可以通过修改数据库连接字符串中的字符集参数来解决。 例如,在使用Firebird的PHP PDO扩展连接数据库时,可以在连接字符串中添加"charset=UTF8"来设置连接字符集为UTF-8。 3. 确保查询结果正确转换为中文字符集。在查询结果中出现乱码时,可以通过使用字符集转换函数如CONVERT或CAST来将查询结果转换为正确的中文字符集。 总结:要解决Firebird查询中文乱码问题,需要确保数据库或表的字符集设置正确,数据库连接字符集数据库或表的字符集一致,并将查询结果正确转换为中文字符集
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值