复现
核心是让 两个不同字符集的字符串进行比较 / 连接 。以下是一个简单易懂的示例,基于 Oracle 数据库的常见场景(国家字符集与数据库字符集冲突)
-- 创建测试表(包含 NVARCHAR2 和 VARCHAR2 列)
CREATE TABLE test_charset (
id NUMBER,
col_nvarchar NVARCHAR2(50), -- 国家字符集(NCHAR_CS)
col_varchar VARCHAR2(50) -- 数据库字符集(如 ZHS16GBK)
);
-- 插入测试数据(中文内容,触发字符集差异)
INSERT INTO test_charset VALUES (1, N'中国', '北京'); -- col_nvarchar 用 N'' 表示国家字符集常量
INSERT INTO test_charset VALUES (2, N'美国', '纽约');
COMMIT;触发字符集不匹配的查询
尝试 将 NVARCHAR2 列与 VARCHAR2 列直接连接,或 用普通字符串常量(数据库字符集)比较 NVARCHAR2 列,都会触发错误:
示例 1:NVARCHAR2 与 VARCHAR2 直接连接
-- 错误:col_nvarchar(NCHAR_CS)和 col_varchar(数据库字符集)连接,字符集不匹配
SELECT id, col_nvarchar || ' - ' || col_varchar AS wrong_concat
FROM test_charset;示例 2:普通字符串常量比较 NVARCHAR2 列
-- 错误:用普通字符串 '中国'(数据库字符集)比较 NVARCHAR2 列(NCHAR_CS)
SELECT id, col_nvarchar
FROM test_charset
WHERE col_nvarchar = '中国'; -- 此处 '中国' 是数据库字符集,与 col_nvarchar 的 NCHAR_CS 冲突解决
查询字符集
SELECT
column_name,
data_type,
char_length,
character_set_name
FROM
user_tab_columns
WHERE
table_name = 'test_charset' AND column_name = 'col_nvarchar';转换字符集
-- 正确:用 N'' 常量匹配 NVARCHAR2 列的字符集
SELECT id, col_nvarchar
FROM test_charset
WHERE col_nvarchar = N'中国'; -- N'' 表示国家字符集,与 col_nvarchar 一致