在wince/mobile上安装完ASA,启动时经常会碰到一个错误:检测到未知原因的安全错误,该错误破坏了程序的内部状态,该程序无法安全正确执行,必须立即终止。
这很可能是因为缺少dbicu引起的。解决方案就是复制2个相应文件到wince windows目录即可。一个文件是通用的库,dat后缀,另一个是针对不同CPU和平台的dll,这两个文件在PC上ASA安装目录中有。以asa10为例:
1,
C:\Program Files\SQL Anywhere 10\ce\dbicudt10.dat
2,
如果在arm.30平台,需要如下文件:
C:\Program Files\SQL Anywhere 10\ce\arm.30\dbicu10.dll
如果在arm.50平台,需要如下文件:
C:\Program Files\SQL Anywhere 10\ce\arm.50\dbicu10.dll
那到底什么dbicu,它到底有什么用?可以看看 sybase 官方给出的说明:
http://dcx.sybase.com/1101/zh/dbadmin_zh11/natlang-s-7944836.html
何谓 ICU、何时需要它?
ICU(即 Unicode 的国际组件)是一个由 IBM 开发并维护的开放源代码库。ICU 通过提供 Unicode 支持促进了软件国际化。SQL Anywhere 使用 ICU 实现了某些字符集转换和归类操作。
数据库服务器上何时需要 ICU?(除 Windows Mobile 之外的所有平台)
理想情况下,ICU 应始终可供数据库服务器使用。下表指出了何时以及因何需要 ICU:
需要 ICU 的情况…… | 注意 |
---|---|
UCA 用作 NCHAR 或 CHAR 字符集的归类。 | UCA 需要 ICU。 |
数据库字符集不是 UTF-8,而是多字节字符集。 | 用于将口令从数据库字符集转换为 UTF-8(数据库口令在内部以 UTF-8 存储)。 |
客户端字符集与数据库字符集不同,而且其中之一是多字节字符集(包括 UTF-8)。这包括 Unicode ODBC、OLE DB、ADO.NET 和 iAnywhere JDBC 应用程序,不管数据库字符集为何,至少有一个客户端没有 ICU。 | 与多字节字符集的来回转换需要 ICU。 |
数据库字符集不是 UTF-8,且需要在 CHAR 和 NCHAR 值之间进行转换。 | 数据库服务器需要使用 ICU 将 UTF-8 转换为另一字符集。 |
嵌入式 SQL 客户端使用了 UTF-8 以外的 NCHAR 字符集。 | 数据库服务器需要使用 ICU 将 UTF-8 转换为另一字符集。请注意,缺省的嵌入式 SQL 客户端 NCHAR 字符集与初始客户端 CHAR 字符集相同。可使用 db_change_nchar_charse 函数对此进行更改。请参见db_change_nchar_charset 函数。 |
使用了 CSCONVERT 或 SORTKEY 函数。调用 CSCONVERT 函数是为了在符合上述第三项要求的字符集之间进行转换。 | 在上述第三项要求的情况下进行转换字符集时需要 ICU。许多 sortkey 标签的 Sortkey 生成都需要 UCA,进而需要 ICU。请参见CSCONVERT 函数 [String]和SORTKEY 函数 [String]。 |
数据库服务器上何时需要 ICU?(Windows Mobile)
下表指出了 Windows Mobile 何时以及因何需要 ICU:
需要 ICU 的情况…… | 注释 |
---|---|
UCA 用作 NCHAR 归类或 CHAR 归类。 | UCA 需要 ICU。 |
使用了 SORTKEY 函数。 | 许多 sortkey 标签的 Sortkey 生成都需要 UCA,进而需要 ICU。请参见SORTKEY 函数 [String]。 |
CHAR 字符集与 OS 字符集不匹配。 | 即使这些字符集匹配,如果使用的是 NCHAR,或 CHAR 字符集为多字节,也建议使用 ICU 来增强字符集转换。 |
注意
如果不安装 ICU 库,则在创建数据库时,必须选择其字符集与 Windows Mobile 字符集匹配的归类或 UTF8BIN 归类作为 CHAR 归类。同样,在创建数据库时,必须选择 UTF8BIN 归类作为 NCHAR 归类。
何时在数据库服务器上不使用 ICU 就能获得正确的字符集转换?
在以下两种情况下,不使用 ICU 就能获得正确的字符集转换:数据库字符集和客户端字符集均为单字节且 sqlany.cvf 可用(所有平台);操作系统支持该转换(仅限 Windows)。这是因为只要sqlany.cvf 文件可用或主机操作系统安装了相应的转换器,就可以不使用 ICU 而进行单字节到单字节的转换。
客户端上何时需要 ICU?(除 Windows Mobile 之外的所有平台)
对于 Unicode 客户端应用程序来说,无论数据库字符集为何,当所有客户端都安装了 ICU 时,均有可能提高客户端和数据库服务器的组合性能。这是因为可以将某些必需的转换活动从数据库服务器下放到客户端,并且所需进行的转换更少。
此外,如果是在 Windows 平台上使用 ODBC,则必须在客户端安装 ICU,甚至对 ANSI 应用程序也是如此。这是因为驱动程序管理器会将 ANSI ODBC 调用转换为 Unicode ODBC 调用。