pra*_*988 2 sql unix oracle shell plsql
我遇到了严重的字符编码问题.给出一些背景知识:
AMERICAN
,WE8ISO8859P1
而Unix NLS_LANG
为AMERICAN_AMERICA.WE8ISO8859P1
.在业务结束时:ÖZER ?N?AAT TAAHHÜT VE
在我们结束时:ÖZER ÝNÞAAT TAAHHÜT VE
如果您注意到土耳其字符?
并且?
正在转换为ISO 8859-1字符集.但是,所有设置(db和unix中的NLS参数)在两端都是相同的ISO8859-1
(西欧)
通过一些研究,我可以理解 - 土耳其机器可以通过实时转换显示土耳其数据(DB NLS设置被本地NLS设置覆盖).
现在,我有一个在我的db中运行的接口 - 有一些PL/SQL脚本(通过shell脚本运行)从数据库中提取一些数据并将它们假脱机到unix路径上的.csv文件.然后通过MFT(托管文件传输)将.csv文件传输到外部系统.
问题是 - Exract永远不会有任何土耳其人的性格.每个土耳其人角色都会被转换成西欧角色,并且像这样对待外部系统,这被视为数据转换/丢失的情况,我的生意真的很不开心.
谁能告诉我 - 我怎么能保留所有土耳其人物?
PS:外部系统的字符集可以设置为ISP8859-9 charcterset.
提前谢谢了.
如果您说您的数据库字符集是ISO-8859-1,即
SELECT parameter, value
FROM v$nls_parameters
WHERE parameter = 'NLS_CHARACTERSET'
Run Code Online (Sandbox Code Playgroud)
返回value
的WE8ISO8859P1
,你是存储数据CHAR
,VARCHAR
或VARCHAR2
列,问题是数据库的字符集不支持全套的土耳其字符.如果字符不在ISO-8859-1代码页布局中,则无法在数据库字符集管理的数据库列中正确存储它.如果要将土耳其数据存储在ISO-8859-1数据库中,则可以改为使用变通方法字符(即将S替换为Ş).但是,如果要支持所有土耳其字符,则需要移动到支持所有这些字符的字符集 - ISO-8859-9或UTF-8相对常见.
但是,更改现有数据库的字符集是一件非常重要的事情."全球化支持指南"中有一章介绍了您正在使用的涵盖字符集迁移的任何Oracle版本.如果要移动到Unicode字符集(这通常是首选方法而不是坚持使用其中一个单字节ISO字符集),则可以使用Oracle数据库迁移助手来实现Unicode.
此时,您通常会看到异议,即至少某些应用程序正在"正确"查看数据,因此数据库必须支持土耳其语字符.问题是,如果你设置NLS_LANG
错误,可以完全绕过字符集转换,这意味着一个字符在客户端上的任何二进制表示都会被持久化而不需要修改数据库.只要每个读取数据的进程都以NLS_LANG
相同和错误的方式配置它们,事情就会起作用.但是,您很快就会发现其他一些应用程序无法NLS_LANG
正确配置相同的错误.例如,Java应用程序总是希望在内部将数据库中的数据转换为Unicode字符串.因此,如果您将数据错误地存储在数据库中,就像听起来一样,那么就无法让这些应用程序正确读取它们.如果您只是在shell脚本中使用SQL*Plus来生成文件,那么几乎可以肯定的是,您的客户端配置不正确,因此数据文件看起来是正确的.但是让现有的错误配置持续存在是一个非常糟糕的主意.你打开自己到很多在未来更大的问题(如果你不是已经在那里),其中不同的客户端插入不同的字符集的数据到数据库使得它更难以解开,当你发现工具,如Oracle导出工具已损坏导出的数据或者您希望使用无法正确配置的工具来查看数据.你可以更早地解决问题.