科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道DB2用户定义函数实现多种语言的排序

DB2用户定义函数实现多种语言的排序

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文主要关注 DB2 V8 for Linux, UNIX, and Windows,但是这个 UDF 示例也可以用在即将发布的 Viper 上。这个 UDF 也应该能够用在 DB2 V7 FP3 或更高版本上,但是这没有经过测试。

来源:IT专家网 2008年6月4日

关键字: 数据库 IBM DB2

  • 评论
  • 分享微博
  • 分享邮件

当在 DB2 UDB 数据库中存储多语种数据时,Unicode 往往是惟一一种能够适应整个数据范围的编码。DB2 可以存储和处理 Unicode 数据,但是它的排序功能只限于二进制排序和三种文化排序。另外,一个数据库只能有一种排序规则,这是在创建数据库时决定的。对于需要支持多种语言的用户和数据的数据库,这些排序限制是一个明显的难题。

IBM 创建了一个用于管理 Unicode 数据的函数库,称为 ICU(International Components for Unicode)。这个库为 C 和 Java™ 编程语言提供了一整套操作 Unicode 数据的函数。这个库是在一种无限制的开放源码许可证下发布的,这使它可以在许多应用程序中使用。

ICU 提供的函数实现了标准的 Unicode Collation Algorithm(UCA)以及许多文化调整功能。很容易将适当的 ICU 函数组合成一个 UDF(用户定义函数),从而让 DB2 可以充分利用 ICU 的排序支持。(随便说一句,DB2 for Linux, UNIX, and Windows 就是使用 ICU 库来实现在 Unicode 数据上支持的三种文化排序。)

本文主要关注 DB2 V8 for Linux, UNIX, and Windows,但是这个 UDF 示例也可以用在即将发布的 Viper 上。这个 UDF 也应该能够用在 DB2 V7 FP3 或更高版本上,但是这没有经过测试。另外,这个 UDF 可能能够用在 DB2 for zSeries® 和 iSeries™ 上,但是这没有经过测试,本文也不讨论这些平台。

安装示例数据库

本文假设要使用的数据库称为 SAMPLE,但是可以使用任何数据库。无论使用哪个数据库,它必须是 Unicode 数据库。为了判断一个数据库是否是 Unicode 数据库,执行以下命令:

db2 get database configuration for sample

接近配置信息顶部的 “Database code page” 条目必须是 “utf-8”。如果没有 Unicode 数据库可用,那么可以用以下命令创建一个:

db2 create database sample using codeset utf-8 territory ca

本文提供了针对 32 位 Intel 和 AMD 平台的二进制代码。下面介绍在 Linux 和 Windows 上如何安装预构建的二进制代码。对于所有其他平台,编译 ICU 和 UDF 中提供了说明。

针对 Linux(32 位 Intel 或 AMD)预构建的二进制代码要在 Linux 上安装预构建的二进制代码:从 “下载” 中下载文件 sortkey-linux-x86.zip 并将它解压到一个临时目录中。将以下文件:

sortkey
    libicui18n.so.34
    libicuuc.so.34
    libicudata.so.34

复制到 sqllib/function 中。 连接到数据库,并运行 DDL 脚本来对这个函数进行编目:

db2 connect to sample
    db2 -tvf createfn.db2

注:这个 Linux 预构建二进制代码是在 Red Hat Linux 7.2 上用 gcc 2.96 编译的。

针对 Windows(32 位)预构建的二进制代码
要在 Windows 上安装预构建的二进制代码:
从 “下载” 中下载文件 sortkey-windows-32.zip 并将它解压到一个临时目录中。
将以下文件:
sortkey.dll
icuin34.dll
icuuc34.dll
icudt34.dll
复制到 sqllib/function 中。
使用一个 DB2 命令窗口连接到数据库,并运行 DDL 脚本来对这个函数进行编目:
db2 connect to sample
db2 -tvf createfn.db2
编译 ICU 和 UDF
要编译 ICU 和 UDF:

下载并安装 ICU 库。参见 “参考资料” 中 ICU 站点的链接,在这里可以下载二进制代码或源代码,以及学习如何编译和安装这个库。如果需要的话,将包含 ICU 可执行文件的目录添加到 PATH 环境变量中。在 Windows 中,还需要更新 LIB 和 INCLUDE 环境变量。LIB 变量应该引用 icu\lib 目录,INCLUDE 应该引用 icu\include 目录。

从 “下载” 中下载文件 sortkey-source.zip 并将它解压到一个临时目录中将文件 sqllib/samples/c/bldrtn(在 Windows 上是 sqllib\samples\c\bldrtn.bat)复制到临时目录并编辑复制的文件。对于编译和链接步骤,需要添加关于 ICU 的信息。

在 Linux 或 UNIX 上,定义变量 ICU_C_FLAGS 和 ICU_L_FLAGS,并将它们添加到编译和链接命令中。这些变量应该在命令前面定义,并在编译器或链接器可执行文件名后面直接使用。清单 1 显示 Linux bldrtn 文件中的相关部分。修改之处以粗体显示。

清单 1. 修改的 Linux bldrtn 文件

# If an embedded SQL program, precompile and bind it.
    if [ -f $1".sqc" ]
    then
    ./embprep $1 $2
    fi

    # ICU options
    ICU_C_FLAGS="`icu-config --cppflags --cxxflags`"
    ICU_L_FLAGS="`icu-config --ldflags`"

    # Compile the program.
    $CC $ICU_C_FLAGS $EXTRA_C_FLAGS-I$DB2PATH/include -c $1.c -D_REENTRANT

    # Link the program and create a shared library
    $CC $ICU_L_FLAGS $LINK_FLAGS -o $1 $1.o $EXTRA_LFLAG -L$DB2PATH/$LIB -ldb2
    -lpthread

在 Windows 上,必须将 ICU 库添加到链接命令中。清单 2 显示 Windows bldrtn.bat 文件中的相关部分。修改之处以粗体显示。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章