复现

核心是让 两个不同字符集的字符串进行比较 / 连接 。以下是一个简单易懂的示例,基于 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 一致