目前我正在使用OCIEnvCreate()创建一个 OCI 会话句柄来与 Oracle 数据库进行通信。我想明确地使用 UTF8 而不是依赖于已设置的任何客户端语言环境,并且我收集到我需要使用它OCIEnvNlsCreate()来执行此操作。但是有一点我不明白。这是 的签名OCIEnvNlsCreate():
sword OCIEnvNlsCreate ( OCIEnv **envhpp,
ub4 mode,
dvoid *ctxp,
dvoid *(*malocfp)
(dvoid *ctxp,
size_t size),
dvoid *(*ralocfp)
(dvoid *ctxp,
dvoid *memptr,
size_t newsize),
void (*mfreefp)
(dvoid *ctxp,
dvoid *memptr))
size_t xtramemsz,
dvoid **usrmempp
ub2 charset,
ub2 ncharset );
注意charset和ncharset是整数类型,而不是字符串。所以我猜我需要指定一个 NLS ID?那么这些 NLS ID 在哪里呢?它们不在任何地方的 OCI 标头中 - 我已经非常彻底地 grep 了它们。我知道应该出现的一些字符串是什么NLS_LANG——比如"CL8MACCYRILLIC"和"TR8PC857"——但它们的 ID 似乎没有在任何地方发布?
我翻遍了 ID 1-999,OCINlsCharSetIdToName()它告诉我 UTF8 是 871,但我对硬编码感到不安,因为 Oracle 决定不记录或公开它?如果我总是使用OCINlsCharSetNameToId( handle, "UTF8" ),我必须先创建一个虚拟会话句柄(使用OCIEnvCreate()or OCIEnvNlsCreate()),调用OCINlsCharSetNameToId(),关闭虚拟会话句柄,然后OCIEnvNlsCreate()使用 NLS ID 再次调用?
这真的是应该工作的方式吗???我一定有这个错误......?