目前我正在使用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 再次调用?
这真的是应该工作的方式吗???我一定有这个错误......?