Oracle通过脚本导入非英文字符(捷克语)乱码问题求助
问题原因与解决方案
- 插入语句缺少NVARCHAR2前缀标识
Oracle中向NVARCHAR2类型字段插入非ASCII字符时,必须在字符串前加
N前缀,否则Oracle会先按数据库默认字符集转换字符串,再存入NVARCHAR2,转换过程就会导致非ASCII字符乱码。SQL Developer默认会自动处理NVARCHAR2字段的插入前缀,所以直接执行没问题,但是脚本执行时不会自动添加该前缀。
修改后的正确插入语句示例:
INSERT INTO Document ("Id","name","fullname") values (1, N"Velmi přívětivý dokument", N"Dokument který byl velmi přívětivý do doby než SQL přeházelo písmenka");
- import.sql脚本本身编码错误
确保导出的import.sql脚本保存格式为UTF-8,不要用GBK、ASCII等窄字符集保存,窄字符集本身无法正确存储捷克语字符,执行时自然会乱码。可以用文本编辑器打开脚本,查看当前编码格式,不对的话重新转码保存即可。
- 执行脚本的Oracle客户端NLS字符集配置错误
执行脚本的客户端(容器内的sqlplus或宿主机的客户端工具)的NLS_LANG环境变量需要和数据库字符集匹配,同时支持中欧字符。推荐设置为
AL32UTF8,对应配置命令:
- Linux/macOS环境执行:
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8- Windows环境cmd执行:
set NLS_LANG=AMERICAN_AMERICA.AL32UTF8
配置完成后再执行sql脚本,即可避免客户端转码导致的乱码问题。
- 确认Oracle数据库字符集配置
可以执行以下SQL查询数据库字符集,确保国家字符集为AL16UTF16(Oracle默认的NVARCHAR2对应字符集,支持所有Unicode字符):
SELECT * FROM nls_database_parameters WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
如果NLS_NCHAR_CHARACTERSET不是AL16UTF16,需要重新建库或者修改国家字符集,否则NVARCHAR2本身就不支持存储捷克语字符。
内容的提问来源于stack exchange,提问作者Justyn
相关产品推荐
相关产品推荐

