一、检查数据库与客户端字符集(前置步骤) 1. 查询数据库字符集: • 执行`SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';`获取数据库编码(如ZHS16GBK) • 执行`SELECT USERENV('language') FROM DUAL;`确认当前会话编码(需与数据库一致) 2. 验证客户端编码: • Windows系统可通过注册表(路径:`HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb11g_home1`)查看`NLS_LANG`值 • Linux系统可通过`echo $NLS_LANG`命令确认客户端编码
二、使用SQL语句查找乱码数据 1. 针对常见乱码(如?乱码): • 执行`SELECT * FROM 表名 WHERE 列名 LIKE '%?%';`筛选包含问号的乱码数据 • 若需精确匹配全乱码(如全为?),可使用`SELECT * FROM 表名 WHERE 列名 = REPEAT('?', LENGTH(列名));` 2. 针对其他编码导致的乱码: • 利用正则表达式匹配非预期字符,例如查找非中文字符:`SELECT * FROM 表名 WHERE REGEXP_LIKE(列名, '[^一-龥]');` • 若数据库版本支持`UTL_I18N`包,可尝试`SELECT * FROM 表名 WHERE UTL_I18N.UTF8TOCHAR(列名) <> 列名;`检测编码转换异常