在Oracle数据库的使用场景中,编码查询是排查乱码、确认数据存储规则的基础操作,不同层级的编码设置对应不同的查询方式,下面详细介绍各类编码的查询方法。

Oracle编码相关基础概念
Oracle的编码设置主要分为三个层级,分别是数据库字符集、客户端字符集和会话字符集。数据库字符集是数据库存储数据时的编码规则,客户端字符集是客户端程序与数据库交互时使用的编码,会话字符集则是当前数据库连接会话生效的编码设置,三者匹配才能避免数据乱码问题。
查询数据库编码的方法
数据库编码是Oracle实例创建时指定的全局编码规则,可以通过系统视图直接查询,常用的查询方式如下。
查询数据库字符集
通过NLS_DATABASE_PARAMETERS视图可以获取数据库级别的编码参数,其中NLS_CHARACTERSET就是数据库字符集,NLS_NCHAR_CHARACTERSET是国家字符集,适用于NVARCHAR2等类型的数据存储。
-- 查询数据库字符集和国家字符集
SELECT parameter, value
FROM NLS_DATABASE_PARAMETERS
WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
执行上述SQL后,返回的value字段就是对应的编码值,比如常见的AL32UTF8、ZHS16GBK等。
查询数据库编码的其他视图方式
也可以通过V$NLS_PARAMETERS视图查询数据库相关的编码参数,这个视图会返回当前实例的NLS参数信息,其中NLS_CHARACTERSET同样对应数据库字符集。
-- 通过V$NLS_PARAMETERS查询数据库字符集 SELECT parameter, value FROM V$NLS_PARAMETERS WHERE parameter = 'NLS_CHARACTERSET';
查询会话编码的方法
会话编码是当前数据库连接生效的编码设置,可能会覆盖数据库默认的编码规则,查询方式如下。
查询当前会话的编码参数
通过NLS_SESSION_PARAMETERS视图可以获取当前会话的所有NLS参数,其中包含会话级别的字符集设置。
-- 查询当前会话的编码相关参数
SELECT parameter, value
FROM NLS_SESSION_PARAMETERS
WHERE parameter IN ('NLS_LANGUAGE', 'NLS_TERRITORY', 'NLS_CHARACTERSET');
查询会话字符集的简化方式
如果只需要查询当前会话的字符集,也可以直接使用USERENV函数获取。
-- 直接获取当前会话字符集
SELECT USERENV('LANGUAGE') AS session_nls FROM DUAL;
返回结果格式通常为语言_地区.字符集,比如SIMPLIFIED CHINESE_CHINA.AL32UTF8,最后一部分就是会话字符集。
查询客户端编码的方法
客户端编码是客户端程序与Oracle交互时使用的编码,不同客户端的查询方式不同。
Windows系统客户端编码查询
如果是Windows系统的命令行客户端,可以通过系统环境变量NLS_LANG查看客户端编码设置,在命令行执行以下命令:
-- 查看Windows系统NLS_LANG环境变量 echo %NLS_LANG%
如果没有返回结果,说明没有设置该环境变量,客户端会使用默认的编码规则。
Linux/Unix系统客户端编码查询
Linux或Unix系统的客户端,同样查看NLS_LANG环境变量,执行以下命令:
-- 查看Linux系统NLS_LANG环境变量 echo $NLS_LANG
代码中查询客户端编码
如果是通过编程语言连接Oracle,也可以在代码中获取连接使用的编码,比如Java程序可以通过连接属性获取:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class OracleCharsetQuery {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
Properties props = new Properties();
props.put("user", "test_user");
props.put("password", "test_pwd");
try (Connection conn = DriverManager.getConnection(url, props)) {
// 获取连接客户端的编码相关属性
String clientEncoding = conn.getClientInfo("NLS_LANG");
System.out.println("客户端编码设置:" + clientEncoding);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
编码不匹配的常见问题
当数据库编码、会话编码、客户端编码三者不一致时,很容易出现中文乱码、数据插入报错等问题。比如数据库是ZHS16GBK,客户端是UTF8,插入中文数据时可能会出现乱码或者长度超限的错误。此时需要先查询三者的编码,再统一调整编码设置,通常建议将三者都设置为AL32UTF8,可以兼容多语言数据存储。
总结
查询Oracle编码需要根据不同的层级选择对应的查询方式,数据库编码通过系统视图查询,会话编码通过会话参数视图查询,客户端编码通过环境变量或代码获取。掌握这些查询方法可以快速定位编码相关的问题,保障Oracle数据库中多语言数据的正常存储和展示。
Oracle查询编码database_charsetNLS_LANG字符集修改时间:2026-06-19 16:12:29