从 postgres 迁移到 oracle (Ansi) 中的奇怪字符
Posted
技术标签:
【中文标题】从 postgres 迁移到 oracle (Ansi) 中的奇怪字符【英文标题】:strange character in migration from postgres to oracle (Ansi) 【发布时间】:2017-07-28 14:45:20 【问题描述】:我正在将一个数据库从 postgres 迁移到 oracle。我使用以下命令创建 csv 文件:
\copy ttt to 'C:\test\ttt.csv' CSV DELIMITER ',' HEADER encoding 'UTF8' quote as '"'; 然后使用 oracle sql loader 我将数据放入 oracle 表中。 没关系,但我在一些描述中描述了这个字符,它不在原始数据库中。 db postgres 的编码是 UTF8,我在窗口机器上。 谢谢大家。 吉安·皮耶罗
【问题讨论】:
在你启动sqlloader之前运行set NLS_LANG=.AL32UTF8
和chcp 65001
好的。它工作。谢谢你。两个问题:1)你明白为什么会出现这个问题吗? 2) 我的 sql 加载器是由 java 程序触发的 你认为从启动 java 的命令行运行这个命令就足够了,还是应该从程序本身运行它?反正我现在在做测试
提供了更多信息作为答案。
【参考方案1】:
在你启动 sqlloader 之前运行
chcp 65001
set NLS_LANG=.AL32UTF8
chcp 65001
将cmd.exe
的代码页设置为UTF-8
(由 sqlloader 和 sqlplus 继承)
使用 set NLS_LANG=.AL32UTF8
告诉 Oracle 数据库“客户端使用 UTF-8”
如果没有这些命令,您会遇到这种情况(由于默认设置)
chcp 850
set NLS_LANG=AMERICAN_AMERICA.US7ASCII
也许您的 PC 上的代码页是 437 而不是 850,这取决于您的 PC 是美国还是欧洲,请参阅National Language Support (NLS) API Reference,列OEM codepage
您可以在 PC 设置中将NLS_LANG
也设置为环境变量,或者您可以在注册表中将其定义为HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG
(对于 32 位),分别。 HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG
您还可以更改 cmd.ext
持久性的代码页,请参阅 https://***.com/a/33475373/3027266
有关 NLS_LANG 的详细信息,请参阅https://***.com/a/33790600/3027266
【讨论】:
以上是关于从 postgres 迁移到 oracle (Ansi) 中的奇怪字符的主要内容,如果未能解决你的问题,请参考以下文章
使用 pg_dump 将 Postgres 从 Windows 迁移到 Linux 时如何选择正确的排序规则来创建数据库?