ORACLE11g数据库字符集从ZHS16GBK转为UTF8遗留问题的解决

                 在之前我写的一篇博客:ORACLE11g数据库字符集从ZHS16GBK转为UTF8中存在一个没有完美解决的问题ORACLE11g数据库字符集从ZHS16GBK转为UTF8遗留问题的解决

     最后经过我公司技术大牛王华文的努力和研究,提出了一个比较完美的解决方案:

@Test
public void initSqlTest2() {
    String baseDir = System.getProperty("user.dir") + "/doc/sql/oracle";
    File baseFile = new File(baseDir);
    List<File> files = DBUtils.getFiles(baseFile);
    for (int i = 0, len = files.size(); i < len; i++)
    {
        File file = files.get(i);
        System.out.println("---------导入开始" + (i + 1) + "---------" + file.getName());
        String extensionName = com.zhixiang.core.util.FileUtils.getExtensionName(file.getName());
        if ("sql".equalsIgnoreCase(extensionName)){
            String oraclHome = DBUtils.getOracleHome(sessionFactory);
            String userName = DBUtils.getUserName(sessionFactory);
            DBUtils.oracleImport(oraclHome, userName, file.getAbsolutePath());
        }else {
            DBUtils.execSql(sessionFactory, file);
        }
        System.out.println("---------结束导入" + (i + 1) + "---------\n");
    }
}

 /**
     * 用source命令导入存储过程
     * @param oracleHome
     * @param absolutePath
     */
    public static void oracleImport(String oracleHome, String userName, String absolutePath)
    {
        BufferedInputStream in = null;
        BufferedReader inBr = null;
        try
        {
            Properties properties = getProperties();
            oracleHome = oracleHome.replace("\\", "/");
            String cmd = "\"" + oracleHome + "/BIN/sqlplus\" "+userName+"/123456 @"+absolutePath;
//            String cmd = "set NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8; \"" + oracleHome + "/BIN/sqlplus\" "+userName+"/123456 @"+absolutePath;
//            String cmd = "\"" + oracleHome + "/BIN/sqlplus\" "+userName+"/123456 @d:/test.sql";
            System.out.println(cmd);
            Runtime.getRuntime().exec(cmd,new String[]{"NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8"});


        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (in != null)
            {
                try
                {
                    in.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
            if (in != null)
            {
                try
                {
                    inBr.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
关键也就是在我标注暗红的代码部分,动态设置NLS_LANG的值,导入sql文件时,将该变量的值只要设置成和sql文件一致的编码即可,读取的sql文件就不会乱码了。而且也不影响系统设置的环境变量的NLS_LANG的值,也就是说在cmd和sqlplus之类的窗口命令中也不会出现中文乱码了。