数据库Firebird支持中文拼音排序
在使用Firebird数据库(这个数据库我就不多介绍了,开源的小众的,但是很牛逼的,我从2005年就开始使用了)的时候,一直纠结的就是拼音排序不准,因为是用的UTF8的字符集,他总是按照ASCII码的顺序给排序,而我们习惯于拼音排序,找个记录值的时候十分头大,下面我就将如何解决Firebird中文排序的方法公布如下,而且我们可以先做个对比。
1、我们去官网(下载地址:https://firebirdsql.org/en/server-packages/)下载Firebird数据库的安装程序,目前正常使用的是Firebird2.5和Firebird3.0版本,因为两个版本有所变化,加上我一直用Firebird2数据库,所以我这里下载的是Firebird2.5版本的安装程序,我们可以看到,Firebird支持很多平台,有Win32,Win64,Linux X86,Linux X64,Mac OSX等,因为目前我只用到WindowsServer,当然我测试使用Win10来测试的,所以我下载的对应版本的Win64的版本的CS版,建议大家下载zip版哦,安装也很方便。
2、启动很简单,Firebird的bin目录下的install_Super.bat运行下就OK了,so easy!Firebird数据库的管理软件比较多,我一直习惯于使用IBExpert这个(这个只有Win32的,我们的Firebird服务器是Win64的,所以这里引用的fbclient.dll也需要是32的),当然也有很多免费的开源的其他的,只是我用这个比较顺手了。下面我就直接建立一个测试用的数据库,名字为TestICU.fdb。
我这里是用工具建立的数据库,当然你也可以用如下的命令行建立:
create database 'localhost:d:\testicu.fdb' default character set GB18030;
然后我们建立一个测试数据表,名字为tb_testicu,当然你也可以用命令行建立并且我们添加几个数据进去。
CREATE TABLE TB_TESTICU ( FID INTEGER NOT NULL, FNAME VARCHAR(20) );
INSERT INTO TB_TESTICU (FID, FNAME) VALUES (1, '张三'); INSERT INTO TB_TESTICU (FID, FNAME) VALUES (2, '李四'); INSERT INTO TB_TESTICU (FID, FNAME) VALUES (3, '王五'); INSERT INTO TB_TESTICU (FID, FNAME) VALUES (4, '赵六'); INSERT INTO TB_TESTICU (FID, FNAME) VALUES (5, '孙七'); INSERT INTO TB_TESTICU (FID, FNAME) VALUES (6, '周八'); INSERT INTO TB_TESTICU (FID, FNAME) VALUES (7, '吴九'); INSERT INTO TB_TESTICU (FID, FNAME) VALUES (8, '郑十');
这个时候我们给现有的数据进行排序,如下图,我们可以看出,排序是乱的。
SELECT FID,FNAME FROM TB_TESTICU
3、现在我们再去ICU官网(下载地址:https://sourceforge.net/projects/icu/files/ICU4C/)下载ICU的文件,Firebird2.5自带的icu是3.0版本的精简版,所以我可以下载icu完整版或者下载更新的版本,为了保险起见,我还是下载安装了大家推荐的和firebird默认版本一样的4.2以上的版本,我下载的是5.2版本的,注意这里下载的是ICU4C,不是ICU4J,4J是for JAVA的。还有一个要注意的,就是我下载的是Win64的firebird,所以icu的版本也要Win64的哦,我第一次下载错了,导致Firebird无法启动。
4、我们将下载后的icu4c和Firebird-2.5.9.27139-0_x64解压后,找到icu4c解压后的bin目录里的icudtxx.dll、icuinxx.dll、icuucxx.dll(XX表示版本号,比如5.2版本就是52)拷贝到Firebird解油后的bin目录里面去,如下图,原来的icudt32.dll、icuin30.dll、icuuc30.dll你可以删除,也可以不删除,我这里选择不删除。
5、接着那我们就需要打开firebird目录下的intl目录下的fbintl.conf文件,我们可以看到在这个文件的开始有关于icu版本的配置,这里需要注意的是,我们需要改的是<intl_module builtin>和<intl_module fbintl>,改好了保存,见下面两个对比图,第二个图是改好后的。
6、这个时候我们可以重新启动Firebird了。这个时候我们同步骤2一样重新建立一个新的数据库,数据库建立后直接做新建一个数据集,并且将数据集现有的UTF8数据集改为新建的数据集。
CREATE COLLATION GB18030_PY FOR GB18030 FROM GB18030_UNICODE CASE INSENSITIVE 'LOCALE=zh;ICU-VERSION=5.2';
ALTER CHARACTER SET GB18030 SET DEFAULT COLLATION GB18030_PY;
本文章参考了如下的英文文章:http://rovanicek.blogspot.com/2012/02/firebird-and-unicode-databases.html。不过按原文章里面的操作是无法成功的,所以我根据实际情况做了简单的修改。