Roracle查询中文乱码求助:设置NLS_LANG后问题仍未解决
Roracle操作Oracle中文乱码及标识符无效问题解决方案
一、标识符无效问题(ORA-00904)
- 先确认字段
CONDITION_NAME7是否真实存在于BI_CONDITION表中,可通过Oracle客户端执行DESC BI_CONDITION查看字段列表。 - 如果字段名创建时用双引号包裹(区分大小写),查询时需用双引号包裹字段名,示例代码:
query <- 'SELECT "CONDITION_NAME7" FROM BI_CONDITION where rownum = 1' result <- dbSendQuery(conn, query, ncharset = "ZHS16GBK")
二、中文乱码问题
已设置NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK仍乱码,可尝试以下步骤:
- 确认环境变量是否生效
在R中执行命令检查NLS_LANG是否被正确读取:
Sys.getenv("NLS_LANG")
若未返回正确值,可在R会话中临时设置:
Sys.setenv(NLS_LANG = "SIMPLIFIED CHINESE_CHINA.ZHS16GBK")
设置后需重启R连接Oracle的会话。
- 匹配Roracle的ncharset参数与数据库字符集
将dbSendQuery的ncharset参数改为数据库对应的字符集ZHS16GBK,而非UTF-8,示例:
query <- "SELECT CONDITION_NAME FROM BI_CONDITION where rownum = 1" result <- dbSendQuery(conn, query, ncharset = "ZHS16GBK") data <- dbFetch(result) print(data)
- 调整R的本地编码
检查R的当前编码:
Sys.getlocale()
若编码与数据库不匹配,设置为对应中文编码:
Sys.setlocale(category = "LC_ALL", locale = "Chinese (Simplified)_China.936")
- 手动转换结果编码
若以上方法无效,可手动转换查询结果的编码:
data$CONDITION_NAME <- iconv(data$CONDITION_NAME, from = "GBK", to = "UTF-8") print(data)
内容的提问来源于stack exchange,提问作者always
相关产品推荐
相关产品推荐

