Linux下SQLPlus遭遇UTF8?如何处理编码问题?

昨天wait4friend在处理部署脚本的时候遭遇了中文乱码。因为以前一直面对国外客户,所以在处理中文乱码上没啥经验,在运维同事的帮助下,折腾了半天终于搞清楚了状况。

背景如下:在Pl/SQL Dev里面进行存储过程的开发,代码里面有中文信息和注释。在Win下把包导出之后,FTP到Linux端,通过SQL Plus来执行。

遇到的第一个问题是,在Linux端看到文件内容里面的中文是乱码。查看之后确认,Win下PL/SQL Dev默认导出的文本是ANSI,还好通过配置可以强制使用UTF8。设置路径如下 Tools –&> Preferences –&> Files –&> Format –&> Encoding

第二个问题是,这样生成的UTF8文件会包含一个BOM文件头。这是一个不可见的部分,但是SQL Plus会报错。

SQL&> @FXKZ_PKG.pks

SP2-0734: unknown command beginning "create ..." - rest of line ignored.

procedure SEND_SMS_PROC

*

ERROR at line 1:

ORA-00900: invalid SQL statement

使用vi看看,有一个&<feff&>,这就是UTF8的BOM

create or replace package FXKZ_PKG as

procedure SEND_SMS_PROC

Linux下的好东西就是多,经过Google,找到一个办法删除BOM

grep -r -l -l $'^\xEF\xBB\xBF' ./*.* | xargs sed -i 's/^\xEF\xBB\xBF//g'

第三个问题是,SQL Plus仍然没有正确识别中文,什么情况?查看之后发现原来是没有设置NLS_LANG参数,这个容易,设置为AMERICAN_AMERICA.UTF8

到此,问题得到圆满解决。为了一劳永逸,写一个部署sql的shell脚本。

echo Executing FXKZ_PKG.pks

sqlplus -L -S $SCHEMA_NAME/$SCHEMA_PWD@$TNSNAME @FXKZ_PKG.pks

echo .

总结:

  1. 脚本要保存成utf8,最好是utf-8 without BOM
  2. Linux端对含有BOM的文件进行处理,删除BOM信息
  3. 设置NLS_LANG

本文链接:http://www.gbjp.cn/dnbk/43971.html

版权及免责声明:本网所转载稿件、图片、视频等内容仅出于向公众传递更多信息的目的,不希望被转载的媒体、公司或个人可与我们联系(909091757@qq.com),我们将立即进行删除处理。所有文章仅代表作者观点,不代表本网立场。