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