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之类的窗口命令中也不会出现中文乱码了。