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
(3)使用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);
Linux程序写入oralce数据库中文显示为问号??? 代码实现设置环境变量!的更多相关文章
- 解决Linux系统下Mysql数据库中文显示成问号的问题
当我们将开发好的javaWEB项目部署到linux系统上,操作数据库的时候,会出现中文乱码问题,比如做插入操作,发现添加到数据库的数据中文出现论码,下面就将解决linux下mysql中文乱码问题! 打 ...
- windows sqlplus客户端连接oralce数据库中文显示问题
运行环境 服务器:centos6.8 服务器oracle版本:oracle 11g R2 64位,字符集是ZHS32utf8. 客户端:navicat 12x64 windows8.1x64 问题分 ...
- C#.NET ORM FreeSql 读取使用 US7ASCII 的 Oracle 数据库中文显示乱码问题
前言 关于 Oracle US7ASCII 中文乱码的问题,Ado.Net 和 Odbc 无法解决.包括最新的.Net Core..NET6..NET7 都无法解决这个问题. FreeSql 对 Or ...
- oracle中文显示为问号
在用PL/sql查询时,中文显示为问号.经查证,发现问题为oracle字符集不支持中文导致的.修改oracle字符集,改为支持中文即可. 方法: 第一步:修改注册表. 开始-运行-输入regedit- ...
- linux命令 - export - 设置环境变量
linux命令 - export - 设置环境变量 功能说明:设置或显示环境变量. 语 法:export [-fnp][变量名称]=[变量设置值] 补充说明:在shell中执行程序时,shell会提供 ...
- Linux设置环境变量小结:设置永久变量&临时变量 全局变量&局部变量
1.总结背景 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容.如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁 ...
- Linux里设置环境变量的方法(export PATH)
1.动态库路径的设置 Linux下调用动态库和windows不一样.linux 可执行程序是靠配置文件去读取路径的,因此有些时候需要设置路径 具体操作如下 export LD_LIBRARY_PATH ...
- Linux中使用export命令设置环境变量
Linux export 命令 2011-08-31 22:36:39| 分类: 命令总结|举报|字号 订阅 功能说明:设置或显示环境变量. ######################## ...
- 00006 - Linux中使用export命令设置环境变量
功能说明:设置或显示环境变量. #################################################################################### ...
随机推荐
- EasyUI combobox 中文无法检索最终解决方案!
写在前面: 因为之前一直用EasyUI的combobox控件,但是苦于在火狐浏览器下输入中文无法直接检索必须在输入完成后再敲击一下键盘才可以(按一下shift或空格),原因是中文输入法屏蔽了EasyU ...
- Android - 基于 Speex 的高度封装语音库,0 耦合使用
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- 【CSS3】使用CSS3线性渐变实现图片闪光划过效果(转)
原文:http://www.nowamagic.net/librarys/veda/detail/2600 资料参考: http://www.cnblogs.com/lhb25/archive/201 ...
- 【分支结构】Jcc 的一些助记
eax > ebx OF=0 SF=0 ZF=0 AF=0 PF=0 CF=0 eax = ebx OF=0 SF=0 ZF=1 AF=0 PF=1 CF=0 eax < ebx OF=0 ...
- Android学习笔记- ButterKnife 8.0注解使用介绍
前言: App项目开发大部分时候还是以UI页面为主,这时我们需要调用大量的findViewById以及setOnClickListener等代码,控件的少的时候我们还能接受,控件多起来有时候就会有一种 ...
- github 或者gitlab 设置添加SSH
克隆项目二种方式: 1. 使用https url克隆, 复制https url 然后到 git clone https-url 2.使用 SSH url 克隆却需要在克隆之前先配置和添加好 SSH ...
- 移动APP云测试平台测评分析
随着智能手机的普及率和渗透率越来越高,App开发软件也越来越多.有专家预测,2017年的App应用下载量将会突破2500亿,整个移动科技市场规模将会达到770亿美元.身处在这个"移动&quo ...
- [dubbo实战] dubbo+zookeeper伪集群搭建
zookeeper作为注册中心,服务器和客户端都要访问,如果有大量的并发,肯定会有等待.所以可以通过zookeeper集群解决. 一.为什么需要zookeeper呢? 大部分分布式应用需要一个主控.协 ...
- 小兴趣:用python生成excel格式座位表
脚本分两个文件: 1.生成二维随机列表:GenerateLocaltion.py 2.将列表导入excel文件:CreateExcel.py 先上GenerateLocaltion.py: impor ...
- <Mastering KVM Virtualization>:第二章 KVM内部原理
在本章中,我们将讨论libvirt.QEMU和KVM的重要数据结构和内部实现.然后,我们将深入了解KVM下vCPU的执行流程. 在这一章,我们将讨论: libvirt.QEMU和KVM的内部运作方式. ...