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);

 

 

自己编了一个股票监控软件,有如下功能,有兴趣的朋友可以下载;

(1)   个股监测。监测个股实时变化,可以监测个股大单交易、急速拉升和下降、主力入场和出场、股票最高点和最低点提醒。检测到最高点、最低点、主力进场点、主力退场点、急速拉升点、急速下跌点,给出语音或者声音提醒,不用再时刻看着大盘了,给你更多自由的时间;

(2)   大盘监测。监测大盘的走势,采用上证、深证、创业三大指数的综合指数作为大盘走势。并实时监测大盘的最高点和最低点、中间的转折点。

(3)   股票推荐。还能根据历史数据长期或短期走势进行分析,对股市3千多个股票进行分析对比,选出涨势良好的股票,按照增长速度从大到小排序,推荐给你涨势良好的股票;

下载地址:

1.0.3版本(修复大盘指数崩溃缺陷)下载地址:

链接:https://pan.baidu.com/s/1BJcTp-kdniM7VE9K5Kd3vg 提取码:003h

更新链接:

https://www.cnblogs.com/bclshuai/p/10621613.html

转载于:https://www.cnblogs.com/bclshuai/p/7467257.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot程序可以通过使用定时任务来实现数据库的增量同步。具体实现步骤如下: 1. 配置定时任务:在Spring Boot程序添加定时任务配置,使用@Scheduled注解指定定时任务的执行时间和频率。 2. 读取最新同步时间:在定时任务执行时,从数据库读取上次同步时间。 3. 读取增量数据:使用JDBC或ORM框架,根据上次同步时间和当前时间,读取数据库发生变化的数据。 4. 处理增量数据:根据业务需求,对读取的增量数据进行处理。 5. 写入目标数据:将处理后的增量数据写入目标数据源。 6. 更新同步时间:将当前时间作为下次同步的起始时间,更新同步时间。 7. 执行定时任务:定时任务每隔一定时间执行一次,重复执行以上步骤。 以下是一个简单的 Spring Boot 实现增量同步的代码示例,供您参考: ```java @Component public class DataSyncTask { @Autowired private DataSource dataSource; @Scheduled(cron = "0 0 0 * * ?") //每天凌晨执行一次 public void syncData() { // 读取最新同步时间 LocalDateTime lastSyncTime = readLastSyncTime(); // 读取增量数据 List<Data> dataList = readIncrementalData(lastSyncTime); // 处理增量数据 List<Data> processedDataList = processData(dataList); // 写入目标数据 writeProcessedData(processedDataList); // 更新同步时间 updateLastSyncTime(LocalDateTime.now()); } private LocalDateTime readLastSyncTime() { // 从数据库读取最新同步时间 // ... return lastSyncTime; } private List<Data> readIncrementalData(LocalDateTime lastSyncTime) { // 使用JDBC或ORM框架,读取增量数据 // ... return dataList; } private List<Data> processData(List<Data> dataList) { // 处理增量数据 // ... return processedDataList; } private void writeProcessedData(List<Data> processedDataList) { // 将处理后的增量数据写入目标数据源 // ... } private void updateLastSyncTime(LocalDateTime syncTime) { // 更新最新同步时间 // ... } } ``` 需要注意的是,增量同步的实现方式会因具体业务需求而异,上面的示例仅供参考。同时,在实际应用,还需要考虑增量同步的性能和数据一致性等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值