Linux程序写入oralce数据库中文显示为问号??? 代码实现设置环境变量!

Linux程序写入oralce数据库中文显示为问号???

1.问题介绍

根本原因是字符集的问题,是数据库的字符集和写入程序的linux系统的字符集不一致导致;

但是用export NLS_LANG=”SIMPLIFIED CHINESE”_CHINA.ZHS16GBK添加环境变量,或者在.bash_profile文件中添加这个环境变量,或者在/etc/profile文件中添加这个环境变量,用source 命令使其生效,后写入oralce数据库的中文还是问号?,接着有重启了系统,重启了服务器,让环境变量生效,还是显示问号;

2.正确的用代码设置字符集的方法

(1)在服务器端查看字符集的类型

用命令:select userenv(‘language‘) from dual  查看数据库的字符集类型是SIMPLIFIED CHINESE_CHINA.ZHS16GBK,注意显示中文末尾必须是ZHS16GBK;

(2)在写入数据库的程序中初始化的数据库之前采用下面的代码设置环境变量

char chValueName[] = "NLS_LANG";

string strLang="SIMPLIFIED CHINESE_CHINA.ZHS16GBK";//必须与数据库服务端的一致

int errorcode=setenv(chValueName, strLang.c_str(), 1);

if (errorcode!=0)

{

ERROR("linux setenv %s failed errorcode %d !",strLang.c_str(),errorcode);

}

else

{

INFO("linux setenv %s succeed !",strLang.c_str());

}

(3)编译程序,重新运行,就可以正常写入汉字到oracle数据库了;

3.字符集介绍

NLS_LANG格式:
NLS_LANG = language_territory.charset
有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:language

指定服务器消息的语言。
territory 指定服务器的日期和数字格式。
charset 指定字符集,只要这一个一致,就可以写入汉字到数据库,这个字段的值决定了字符转换格式,如果不一致,就会找不到字符,一个汉字就会显示为两个问号;

4.linux添加环境变量的几种方法

(1)直接在终端用命令添加,这个环境变量设置只在该终端窗口中有效,退出窗口就会失效;

export NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

(2)在.bash_profile文件中添加,/etc/profile对所有用户生效,~/.bash_profile只对当前用户生效。用命令vi .bash_profile添加也是用export NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

(3)在/etc/profile中添加,对所有的用户有效;修改完后需要用source命令使其生效;

vi /etc/profile

(4)使用shell脚本添加环境变量

if grep -Fxq "export NLS_LANG=\"SIMPLIFIED CHINESE\"_CHINA.ZHS16GBK" /etc/profile

then

echo " export NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK found"

else

echo " add NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK to file"

sed -i ‘$a export NLS_LANG=\"SIMPLIFIED CHINESE\"_CHINA.ZHS16GBK‘ /etc/profile

source /etc/profile

fi

5.windows下设置环境变量

char chValueName[] = "NLS_LANG";

string strLang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK;

HKEY hKey = NULL;

DWORD dwDataLen = SMALL_LEN;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, “System\\CurrentControlSet\\Control\\Session Manager\\Environment”, 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)

{

DB_DEBUG("RegOpenKey %s fail, err:%ld", “System\\CurrentControlSet\\Control\\Session Manager\\Environment”, GetLastError());

break;

}

//先查看有没有环境变量

if (RegQueryValueEx(hKey, chValueName, NULL, NULL, (BYTE*)chData, &dwDataLen) == ERROR_SUCCESS)

{//如果已经设置且相同则返回

if (strLang.compare(chData) == HPR_OK)

{

RegCloseKey(hKey);

iRetVal = HPR_OK;

break;

}

}

RegCloseKey(hKey);

//如果没有设置或者不同,则重新设置;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, g_chRegEnvPath, 0, KEY_SET_VALUE, &hKey) != ERROR_SUCCESS)

{

break;

}

RegSetValueEx(hKey, chValueName, 0, REG_SZ, (const BYTE*)strLang.c_str(), strLang.length());

DWORD_PTR dwResult = 0;

//使立即生效

LRESULT lRet = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, LPARAM("Environment"), SMTO_ABORTIFHUNG, 2000, &dwResult);

if (lRet != 0)

{

RegCloseKey(hKey);

DB_DEBUG("Change Oracle nls lang:%s to:%s success!", chData, strLang.c_str());

break;

}

DB_DEBUG("Change Oracle nls lang:%s to:%s failed!", chData, strLang.c_str());

RegCloseKey(hKey);

时间: 2024-10-21 01:49:22

Linux程序写入oralce数据库中文显示为问号??? 代码实现设置环境变量!的相关文章

解决Linux系统下Mysql数据库中文显示成问号的问题

当我们将开发好的javaWEB项目部署到linux系统上,操作数据库的时候,会出现中文乱码问题,比如做插入操作,发现添加到数据库的数据中文出现论码,下面就将解决linux下mysql中文乱码问题! 打开Linux窗口,启动mysql. 连接mysql输入show variables like '%char%'; 出现如下图,这样的话在linux下操作mysql会出现中文乱码,所以我们要解决这个问题. 关闭mysql,找到 /etc/my.cnf 文件 3.1 如果没有找到my.cnf文件,就从

R连接Mysql时,中文显示为问号的解决方案

1.打开Mysql安装目录下的my.ini文件,将其中的default-character-set= 均设置为GBK 2.在管理工具——数据源(ODBC)中将创建好的数据源作如下设置: R连接Mysql时,中文显示为问号的解决方案

Linux下设置环境变量

setenv(set environment variable) 功能说明:查询或显示环境变量.语 法:setenv [变量名称][变量值]补充说明:setenv为tsch中查询或设置环境变量的指令. 对于bash shell关 于环境变量命令介绍:1.echo 显示某个环境变量值 echo $PATH2.export 设置一个新的环境变量 export HELLO="hello" (可以无引号)3.env 显示所有环境变量4.set 显示本地定义的shell变量5.unset 清除环

Linux设置环境变量方法(export PATH)

1.动态库路径的设置 Linux下调用动态库和windows不一样.linux 可执行程序是靠配置文件去读取路径的,因此有些时候需要设置路径 具体操作如下 export LD_LIBRARY_PATH=/home/.....(动态库的目录) 不过这种设置方法只是在当前的session中有效 你可以修改配置文件实现任何session都有效 2.环境变量的设置 一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量.例如我的mips-linux-gcc编译器在"/opt/a

Linux设置环境变量小结:设置永久变量&临时变量 全局变量&局部变量

1.总结背景 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容.如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁琐了. 这涉及到环境变量PATH的设置问题,而PATH的设置也是在linux下定制环境变量的一个组成部分. 2.变量简介 Linux是一个多用户的操作系统.每个用户登录系统后,都会有一个专用的运行环境.通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义.用户可以对自己的运行环

Linux 下如何设置环境变量

假如你安装了一个软件,安装好后,输入命令时,提示"command not found", 这涉及到环境变量的PATH问题.PATH设置是linux下定制环境变量的一个组成部分. linux中每个用户都有一个专门的运行环境,这个环境就是一组环境变量的定义,用户可以对自己的运行环境进行定制.环境和Shell紧密相关,用户登录系统后就启动了一个Shell,一般是bash,bash有两个系统级配置文件,/etc/bashrc 和 /etc/profile. 1, echo 显示环境变量. ec

Linux和Windows下查看、设置环境变量的比较

[一]查看环境变量: 1.windows 查看所有的变量:set    范例:>set    查看某个变量的值:set 环境变量名    范例:     >set JAVA_HOME      JAVA_HOME=D:\jdk 2.linux 查看所有的变量:export    范例:export    查看某个变量的值:echo $环境变量名    范例:>echo $JAVA_HOME [二]设置环境变量: 1.windows set 环境变量名=值    范例:         

JAVA设置环境变量和在DOS下运行java程序

在学校实训的这几天,老师带着我们开始深入的复习java.这是第一天的内容哦 对于“JAVA设置环境变量和在DOS下运行java程序”,许多初学者是陌生的,但了解这个却对后期的学习很重要. http://blog.sina.com.cn/s/blog_639403840100i5rt.html 下面先来了解一下什么是dos吧 dos 我们使用计算机接触最频繁的就是DOS.DOS是英文Disk Operating System的缩写,意思是“磁盘操作系统”,顾名思义,DOS主要是一种面向磁盘的系统软

Linux 启动文件、设置环境变量的位置

系统级启动文件  ==================================== 1./etc/rc  主启动文件,不要修改它 2./etc/rc.conf  决定启动哪些系统自带的守护进程,不要修改它 3./etc/rc.conf.local 如果你想干涉系统启动时启动的守护进程,请编辑本文件,本文件的内容会覆盖/etc/rc.conf中的内容. 4./etc/rc.local  重点,你想让Nginx,MySQL,Tomcat自启动,请修改这个文件. 5./etc/rc.shutd