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数据库中文显示为问号??? 代码实现设置环境变量!的更多相关文章

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

    当我们将开发好的javaWEB项目部署到linux系统上,操作数据库的时候,会出现中文乱码问题,比如做插入操作,发现添加到数据库的数据中文出现论码,下面就将解决linux下mysql中文乱码问题! 打 ...

  2. windows sqlplus客户端连接oralce数据库中文显示问题

    运行环境 服务器:centos6.8 服务器oracle版本:oracle 11g R2 64位,字符集是ZHS32utf8. 客户端:navicat 12x64  windows8.1x64 问题分 ...

  3. C#.NET ORM FreeSql 读取使用 US7ASCII 的 Oracle 数据库中文显示乱码问题

    前言 关于 Oracle US7ASCII 中文乱码的问题,Ado.Net 和 Odbc 无法解决.包括最新的.Net Core..NET6..NET7 都无法解决这个问题. FreeSql 对 Or ...

  4. oracle中文显示为问号

    在用PL/sql查询时,中文显示为问号.经查证,发现问题为oracle字符集不支持中文导致的.修改oracle字符集,改为支持中文即可. 方法: 第一步:修改注册表. 开始-运行-输入regedit- ...

  5. linux命令 - export - 设置环境变量

    linux命令 - export - 设置环境变量 功能说明:设置或显示环境变量. 语 法:export [-fnp][变量名称]=[变量设置值] 补充说明:在shell中执行程序时,shell会提供 ...

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

    1.总结背景 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容.如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁 ...

  7. Linux里设置环境变量的方法(export PATH)

    1.动态库路径的设置 Linux下调用动态库和windows不一样.linux 可执行程序是靠配置文件去读取路径的,因此有些时候需要设置路径 具体操作如下 export LD_LIBRARY_PATH ...

  8. Linux中使用export命令设置环境变量

    Linux export 命令 2011-08-31 22:36:39|  分类: 命令总结|举报|字号 订阅     功能说明:设置或显示环境变量. ######################## ...

  9. 00006 - Linux中使用export命令设置环境变量

    功能说明:设置或显示环境变量. #################################################################################### ...

随机推荐

  1. (转)java并发之Executor

    场景: 线程池在面试时候经常会碰到,在工作中用的场景更多,所以很有必要弄清楚. 1 简介 Java自1.5以来加入了处理一批线程的方法,也就是java并发包里的Executor.本文主要介绍Execu ...

  2. python学习好文

    摘要: 学习别人的学习历程. 一 iTech的博客 http://www.cnblogs.com/itech/archive/2011/01/31/1948265.html

  3. JPA Advanced Mappings(映射)

    JPA Advanced Mappings(映射) JPA是一个使用java规范发布的库.因此,它支持所有面向对象的实体持久性概念. 原文链接:http://blogxinxiucan.sh1.new ...

  4. cesium根据经纬度计算距离

    var startLatitude = 36;var startLongitude = 120; var endLatitude=34; var endLongitude=121; var start ...

  5. 初学Python(十)——列表生成式

    初学Python(十)--列表生成式 初学Python,主要整理一些学习到的知识点,这次是列表生成式. # -*- coding:utf-8 -*- ''''' 列表生成式 ''' #一行代码表达所有 ...

  6. php nginx反向代理

    一.概念理解 1.代理服务器 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘 ...

  7. 【前端,干货】react and redux教程学习实践(二)。

    前言 这篇博文接 [前端]react and redux教程学习实践,浅显易懂的实践学习方法. ,上一篇简略的做了一个redux的初级demo,今天深入的学习了一些新的.有用的,可以在生产项目中使用的 ...

  8. Django 1.9 admin 使用suit 小记

    最近项目做到了后台管理的部分.Django虽然提供了后台管理,但是界面不咋好看.所以我使用了suit.官网http://djangosuit.com/ 步骤: 1,安装suit 项目settings. ...

  9. Oracle数据库 拾漏补缺

    select语句的基本使用 可以查询需要的列,行,可以进行多表链接,连接查询. from p_emp e select 后面跟的是要显示的结果,可以是通过运算或者连接符号得出的伪列 null  空值 ...

  10. Andrew Ng机器学习课程笔记(五)之应用机器学习的建议

    Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.h ...