设置环境变量修改Oracle客户端字符集
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
此时, 当数据从数据库中提取出来并在客户端显示时, 必 须 进 行 从 ZHS16GBK 到 US7ASCII 字 符 集 的 转 换 。 如 果 US7ASCII 字符集不包含某些 ZHS16GBK 字符集中的 字 符 ( 例 如汉字) 时, 则使用特定的字符( 一般用“? ”) 代替。因此, 客户 端和数据库服务端字符集不同, 容易发生因字符集转换带来 的数据转换或损耗。
PARAMETER
VALUE
------------------------------
-------------------------
NLS_CHARACTERSET
US7ASCII
影 响 客 户 端 字 符 集 的 是 环 境 变 量 NLS_LANG, 在 Win-
dows 中 , 确 定 客 户 端 字 符 集 首 先 是 本 进 程 定 义 的 环 境 变 量
在前文提到的问题中, 当字符集为 US7ASCII 的数据库数 据传送到字符集为 ZHS16GBK 数据库之前, 必须分别用不同 客户端字符集连接不同的数据库, 否则至少会出现 1 次字符 集转换的问题。同样, 程序至少需要做 1 次修改客户端字符集 的操作。
常见修改客户端字符集方法是 修 改 注 册 表 中 NLS_LANG 的值, 连接数据库后, 再将注册表中的值恢复。此方法存在 2 个问题: ( 1) 某些情况, 操作系统不允许修改注册表; ( 2) 如果 忘记将注册表中 NLS_LANG 的值恢复, 可能会影响其他程序。
nls_database_parameters 获权限, 无需额外授权:
SQL> select PARAMETER, VALUE
2 from nls_database_parameters
3 where PARAMETER ='NLS_CHARACTERSET';
如前文所述, 影响客户端字符集值的首先是环境变量 NLS_LANG。因此, 在应用程序中可以通过修改本程序的环境 变量 NLS_LANG 来达到目的。以开发语言 PowerBuilder 为例, 通 过 调 用 Windows 的 API 设 置 环 境 变 量 NLS_LANG 来 修 改 客户端字符集。
如果想重设环境变量 NLS_LANG,使程序使用系统注册表 中 定 义 的 NLS_LANG 值 , 只 需 将 环 境 变 量 NLS_LANG 置 为 NULL。 代 码 实 现 如 下 : String ls_Enviorment_Variable = "NLS_LANG" String ls_Value3 SETNULL(ls_Value3) SetEnvironmentVariable(ls_Enviorment_Variable, ls_Value3) 4 方法改进
45 医疗卫生装备·2007 年 12 月第 28 卷第 12 期
Chine s e Me dica l Equipme nt J ourna·l Vol.28 No.12 De ce mbe r 2007
医院数字化 HOS PITAL DIGITALIZATION
NLS_LANG; 其 次 , 查 找 系 统 定 义 的 该 环 境 变 量 ; 最 后 , 则 使 用 注册表中的定义。当客户端连接数据库成功后, 会话直到断开 连接前将一直使用该字符集, 不受客户端修改字符集的影响。 3 解决方法
S e t t in g e n viro n m e n t va ria b le t o u p d a t e Ora cle clie n t 's ch a ra ct e r s e t
WU Ya n- ming1, GUO Ge 2 (1. Beijing Hos pital, Beijing 100730, China; 2. Information Center, Health Department of General Logis tics
首先定义外部函数: FUNCTION ulong SetEnvironmentVariable (ref string lpName,ref string lpValue) LIBRARY "kernel32.dll" ALIAS FOR "SetEnvi- ronmentVariableA" 在连接第 1 个数据库之前, 首先置环境变量 NLS_LANG 的值 为 : "AMERICAN_AMERICA.US7ASCII" , 成 功 连 接 后 , 置 环 境 变 量 NLS_LANG 的 值 为 : "AMERICAN_AMERICA ZHS16GBK"。连接第 2 个数据库, 简化的代码如下: Transaction sqlca_1 , sqlca_2 // 定 义 2 个 事 务 对 象, 分 别 连 接 2 个数据库 String ls_Enviorment_Variable = "NLS_LANG" String ls_Value1 = "AMERICAN_AMERICA.US7ASCII" String ls_Value2 = "AMERICAN_AMERICA.ZHS16GBK" /* 连接第 1 个数据库 */ sqlca_1 = Create Transaction /* 设 置 sqlca_1 有 关 属 性 值 , 例 如 dbms、servername、logid 和 logpass */ …… /* 设 置 环 境 变 量 NLS_LANG 为 AMERICAN_AMERICA . US7ASCII */ SetEnvironmentVariable(ls_Enviorment_Variable, ls_Value1) CONNECT USING SQLCA _1 ; /* 连接第 1 个数据库 */ sqlca_2 = Create Transaction /* 设 置 sqlca_2 有 关 属 性 值 , 例 如 dbms、servername、logid 和 logpass */ …… /* 设 置 环 境 变 量 NLS_LANG 为 AMERICAN_AMERICA. ZHS16GBK */ SetEnvironmentVariable(ls_Enviorment_Variable, ls_Value2) CONNECT USING SQLCA_2 ; /* 其他数据处理 ……. */
Oracle 数 据 库 是 通 过 字 符 集 支 持 国 家 语 言 的 体 系 结 构 , 它 允 许 使 用 本 地 化 语 言 来 存 储 、处 理 和 检 索 数 据 。字 符 集 不 同 决定了数据存储格式和显示形式的不同。
Oracle 数据库的 字 符 集 分 为 服 务 端 字 符 集 和 客 户 端 字 符 集, 数据库服务端的字符集决定数据在数据库中存储的格式, 例如: 1 个汉字在单字节字符集 ( 如 US7ASCII) , 占用 2 个字 节, 而在多字节字符集( 如 ZHS16GBK) 中只占 1 个字节。客户 端的字符集决定数据检索出来后显示的形式。数据库服务端 字符集和客户端字符集可以是不同的( 见图 1) 。
医院数字化 HOS PITAL DIGITALIZATION
设置环境变量修改 Or acle客户端字符集
吴燕明 1 郭 歌 2 ( 1.北京医院 北京市 100730; 2.总后卫生部信息中心 北京市 100842)
摘要 目的: 防止不同字符集的 Oracle 数据库间进行数据交换时产生数据转换或损耗。方法: 通过设置环境变量修改客 户端字符集, 可以简单而有效地解决因字符集转换而带来的数据转换或损耗的问题。结果: 修改应用程序的环境变量而 不是注册表, 可同时链接不同字符集的 Oracle 数据库。结论: 通过给出 1 个客户端自适应服务端字符集的方法可以解决 数据转换或损耗问题。 关键词 Oracle; 字符集; 环境变量 中图分类号: TP311.138 文献标志码: A 文章编号: 1003- 8868( 2007) 12- 0045- 02
在上面的例子中, 已知数据库服务端的字符集, 再设置相 应的客户端字符集。那么, 在不知数据库服务端字符集的情况 下, 怎样做到自适应设置客户端的字符集。
首先, 连接数据库, 获取数据库服务端的字符集; 然后, 断 开连接, 按照所取得的数据库服务端字符集, 重新设置客户端 字符集; 最后, 连接数据库。由于字符集的代码都是英文字母, 而任何字符集都包括英文字母, 在第 1 次连接数据库时, 即使 客户端和服务端字符集不匹配, 也会取得正确的服务端的字 符集, 而不会出现因字符集转换产生数据转换或损耗的问题。 其实现代码如下: String ls_Enviorment_Variable = "NLS_LANG" String ls_characterset /* 设置 sqlca 有关属性值, 例如 dbms、servername、logid 和 log- pas */ …… CONNECT USING SQLCA ; /* 提取数据库服务器端字符集, */ select value into :ls_characterset from nls_database_parameters where parameter = 'NLS_CHARACTERSET' USING SQLCA; If sqlca.sqlcode = 0 Then /* 断开事务 */ DISCONNECT USING SQLCA ; /* 设置 NLS_LANG 环境变量 */ ls_characterset = "AMERICAN_AMERICA." +ls_characterset SetEnvironmentVariable (ls_Enviorment_Variable, ls_character- set) /* 重新连接事务 */ CONNECT USING SQLCA ; End If 5 小结
影响 Oracle 字符集最重要的参数是 NLS_LANG。它的格
作者简介: 吴燕明, 助理工程师, 主要从事医院信息化建设方面的研究工 作, Email: annetta@126.com。
数据 ( ZHS16GBK)
工作站 ( US7ASCII)
图 1 具有不同字符集的数据库服务端与客户端
式为:
NLS_LANG = language_territory.charset , 例如:AMERICAN
_ AMERICA. ZHS16GBK。
它由 3 部分组成( 语言、地域和字符集) , 其中前两部 分 控
制服务器消息的语言和服务器的日期以及数字格式, 真正影
响数据库字符集是第三部分。因此, 只需服务器端和客户端该
字符集一致就不会发生数据集转换。
数据库服务端的字符集是在创建数据库时指定的, 一般
情况不建议修改数据库服务端的字符集。可以查询视图
Department, Beijing 100842, China) Abstr act Objective To prevent data transfer or loss in application development when dealing with data exchange between Oracle database with different server's character set. Methods Environment variable is set to update Oracle client's character set so as to solve data transfer or loss caused by character set transformation. Results It was the environment variable not the register list that was reset, so Oracle databases with different server's character set were not connected at the same time. Conclusion An adaptive method for different server's character set is given to solve this problem. Key wor ds Oracle; character set; environment variable
1 不同字符集数据库间的数据交换问题 Oracle 不同字符 集 数 据 库 间 的 数 据 交 换 问 题 在 医 院 信 息
系统中经常遇到。目前 “军卫一号”信息系统使用的 Oracle 数 据库采 用 的 常 见 字 符 集 为 US7ASCII, 而 某 些 地 区 医 保 系 统 使 用 的 Oracle 数 据 库 的 字 符 集 是 ZHS16GBK, 业 务 上 常 要 求 2 个数据库之间进行数据交换。例如, 医院信息系统上传患者费 用明细至医保系统等。因字符集不同, 相关应用程序连接 2 个 数据库时必须做处理, 否则容易发生因字符集转换而使得交 换后的数据发生转换或损耗。 2 Ora cle 数据库字符集简介
PARAMETER
VALUE
------------------------------
-------------------------
NLS_CHARACTERSET
US7ASCII
影 响 客 户 端 字 符 集 的 是 环 境 变 量 NLS_LANG, 在 Win-
dows 中 , 确 定 客 户 端 字 符 集 首 先 是 本 进 程 定 义 的 环 境 变 量
在前文提到的问题中, 当字符集为 US7ASCII 的数据库数 据传送到字符集为 ZHS16GBK 数据库之前, 必须分别用不同 客户端字符集连接不同的数据库, 否则至少会出现 1 次字符 集转换的问题。同样, 程序至少需要做 1 次修改客户端字符集 的操作。
常见修改客户端字符集方法是 修 改 注 册 表 中 NLS_LANG 的值, 连接数据库后, 再将注册表中的值恢复。此方法存在 2 个问题: ( 1) 某些情况, 操作系统不允许修改注册表; ( 2) 如果 忘记将注册表中 NLS_LANG 的值恢复, 可能会影响其他程序。
nls_database_parameters 获权限, 无需额外授权:
SQL> select PARAMETER, VALUE
2 from nls_database_parameters
3 where PARAMETER ='NLS_CHARACTERSET';
如前文所述, 影响客户端字符集值的首先是环境变量 NLS_LANG。因此, 在应用程序中可以通过修改本程序的环境 变量 NLS_LANG 来达到目的。以开发语言 PowerBuilder 为例, 通 过 调 用 Windows 的 API 设 置 环 境 变 量 NLS_LANG 来 修 改 客户端字符集。
如果想重设环境变量 NLS_LANG,使程序使用系统注册表 中 定 义 的 NLS_LANG 值 , 只 需 将 环 境 变 量 NLS_LANG 置 为 NULL。 代 码 实 现 如 下 : String ls_Enviorment_Variable = "NLS_LANG" String ls_Value3 SETNULL(ls_Value3) SetEnvironmentVariable(ls_Enviorment_Variable, ls_Value3) 4 方法改进
45 医疗卫生装备·2007 年 12 月第 28 卷第 12 期
Chine s e Me dica l Equipme nt J ourna·l Vol.28 No.12 De ce mbe r 2007
医院数字化 HOS PITAL DIGITALIZATION
NLS_LANG; 其 次 , 查 找 系 统 定 义 的 该 环 境 变 量 ; 最 后 , 则 使 用 注册表中的定义。当客户端连接数据库成功后, 会话直到断开 连接前将一直使用该字符集, 不受客户端修改字符集的影响。 3 解决方法
S e t t in g e n viro n m e n t va ria b le t o u p d a t e Ora cle clie n t 's ch a ra ct e r s e t
WU Ya n- ming1, GUO Ge 2 (1. Beijing Hos pital, Beijing 100730, China; 2. Information Center, Health Department of General Logis tics
首先定义外部函数: FUNCTION ulong SetEnvironmentVariable (ref string lpName,ref string lpValue) LIBRARY "kernel32.dll" ALIAS FOR "SetEnvi- ronmentVariableA" 在连接第 1 个数据库之前, 首先置环境变量 NLS_LANG 的值 为 : "AMERICAN_AMERICA.US7ASCII" , 成 功 连 接 后 , 置 环 境 变 量 NLS_LANG 的 值 为 : "AMERICAN_AMERICA ZHS16GBK"。连接第 2 个数据库, 简化的代码如下: Transaction sqlca_1 , sqlca_2 // 定 义 2 个 事 务 对 象, 分 别 连 接 2 个数据库 String ls_Enviorment_Variable = "NLS_LANG" String ls_Value1 = "AMERICAN_AMERICA.US7ASCII" String ls_Value2 = "AMERICAN_AMERICA.ZHS16GBK" /* 连接第 1 个数据库 */ sqlca_1 = Create Transaction /* 设 置 sqlca_1 有 关 属 性 值 , 例 如 dbms、servername、logid 和 logpass */ …… /* 设 置 环 境 变 量 NLS_LANG 为 AMERICAN_AMERICA . US7ASCII */ SetEnvironmentVariable(ls_Enviorment_Variable, ls_Value1) CONNECT USING SQLCA _1 ; /* 连接第 1 个数据库 */ sqlca_2 = Create Transaction /* 设 置 sqlca_2 有 关 属 性 值 , 例 如 dbms、servername、logid 和 logpass */ …… /* 设 置 环 境 变 量 NLS_LANG 为 AMERICAN_AMERICA. ZHS16GBK */ SetEnvironmentVariable(ls_Enviorment_Variable, ls_Value2) CONNECT USING SQLCA_2 ; /* 其他数据处理 ……. */
Oracle 数 据 库 是 通 过 字 符 集 支 持 国 家 语 言 的 体 系 结 构 , 它 允 许 使 用 本 地 化 语 言 来 存 储 、处 理 和 检 索 数 据 。字 符 集 不 同 决定了数据存储格式和显示形式的不同。
Oracle 数据库的 字 符 集 分 为 服 务 端 字 符 集 和 客 户 端 字 符 集, 数据库服务端的字符集决定数据在数据库中存储的格式, 例如: 1 个汉字在单字节字符集 ( 如 US7ASCII) , 占用 2 个字 节, 而在多字节字符集( 如 ZHS16GBK) 中只占 1 个字节。客户 端的字符集决定数据检索出来后显示的形式。数据库服务端 字符集和客户端字符集可以是不同的( 见图 1) 。
医院数字化 HOS PITAL DIGITALIZATION
设置环境变量修改 Or acle客户端字符集
吴燕明 1 郭 歌 2 ( 1.北京医院 北京市 100730; 2.总后卫生部信息中心 北京市 100842)
摘要 目的: 防止不同字符集的 Oracle 数据库间进行数据交换时产生数据转换或损耗。方法: 通过设置环境变量修改客 户端字符集, 可以简单而有效地解决因字符集转换而带来的数据转换或损耗的问题。结果: 修改应用程序的环境变量而 不是注册表, 可同时链接不同字符集的 Oracle 数据库。结论: 通过给出 1 个客户端自适应服务端字符集的方法可以解决 数据转换或损耗问题。 关键词 Oracle; 字符集; 环境变量 中图分类号: TP311.138 文献标志码: A 文章编号: 1003- 8868( 2007) 12- 0045- 02
在上面的例子中, 已知数据库服务端的字符集, 再设置相 应的客户端字符集。那么, 在不知数据库服务端字符集的情况 下, 怎样做到自适应设置客户端的字符集。
首先, 连接数据库, 获取数据库服务端的字符集; 然后, 断 开连接, 按照所取得的数据库服务端字符集, 重新设置客户端 字符集; 最后, 连接数据库。由于字符集的代码都是英文字母, 而任何字符集都包括英文字母, 在第 1 次连接数据库时, 即使 客户端和服务端字符集不匹配, 也会取得正确的服务端的字 符集, 而不会出现因字符集转换产生数据转换或损耗的问题。 其实现代码如下: String ls_Enviorment_Variable = "NLS_LANG" String ls_characterset /* 设置 sqlca 有关属性值, 例如 dbms、servername、logid 和 log- pas */ …… CONNECT USING SQLCA ; /* 提取数据库服务器端字符集, */ select value into :ls_characterset from nls_database_parameters where parameter = 'NLS_CHARACTERSET' USING SQLCA; If sqlca.sqlcode = 0 Then /* 断开事务 */ DISCONNECT USING SQLCA ; /* 设置 NLS_LANG 环境变量 */ ls_characterset = "AMERICAN_AMERICA." +ls_characterset SetEnvironmentVariable (ls_Enviorment_Variable, ls_character- set) /* 重新连接事务 */ CONNECT USING SQLCA ; End If 5 小结
影响 Oracle 字符集最重要的参数是 NLS_LANG。它的格
作者简介: 吴燕明, 助理工程师, 主要从事医院信息化建设方面的研究工 作, Email: annetta@126.com。
数据 ( ZHS16GBK)
工作站 ( US7ASCII)
图 1 具有不同字符集的数据库服务端与客户端
式为:
NLS_LANG = language_territory.charset , 例如:AMERICAN
_ AMERICA. ZHS16GBK。
它由 3 部分组成( 语言、地域和字符集) , 其中前两部 分 控
制服务器消息的语言和服务器的日期以及数字格式, 真正影
响数据库字符集是第三部分。因此, 只需服务器端和客户端该
字符集一致就不会发生数据集转换。
数据库服务端的字符集是在创建数据库时指定的, 一般
情况不建议修改数据库服务端的字符集。可以查询视图
Department, Beijing 100842, China) Abstr act Objective To prevent data transfer or loss in application development when dealing with data exchange between Oracle database with different server's character set. Methods Environment variable is set to update Oracle client's character set so as to solve data transfer or loss caused by character set transformation. Results It was the environment variable not the register list that was reset, so Oracle databases with different server's character set were not connected at the same time. Conclusion An adaptive method for different server's character set is given to solve this problem. Key wor ds Oracle; character set; environment variable
1 不同字符集数据库间的数据交换问题 Oracle 不同字符 集 数 据 库 间 的 数 据 交 换 问 题 在 医 院 信 息
系统中经常遇到。目前 “军卫一号”信息系统使用的 Oracle 数 据库采 用 的 常 见 字 符 集 为 US7ASCII, 而 某 些 地 区 医 保 系 统 使 用 的 Oracle 数 据 库 的 字 符 集 是 ZHS16GBK, 业 务 上 常 要 求 2 个数据库之间进行数据交换。例如, 医院信息系统上传患者费 用明细至医保系统等。因字符集不同, 相关应用程序连接 2 个 数据库时必须做处理, 否则容易发生因字符集转换而使得交 换后的数据发生转换或损耗。 2 Ora cle 数据库字符集简介