zoukankan      html  css  js  c++  java
  • Linux下SQL Plus遭遇UTF8

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

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

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

    image

    第二个问题是,这样生成的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

    <feff>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 Remove the UTF8 BOM if needed
    grep -r -l -l $'^\xEF\xBB\xBF' ./*.* | xargs sed -i 's/^\xEF\xBB\xBF//g'
    echo .

    # in order to read UTF8 chinese in SQLPlus
    echo export NLS_LANG=AMERICAN_AMERICA.UTF8
    export NLS_LANG=AMERICAN_AMERICA.UTF8
    echo .


    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
    作者:wait4friend
    Weibo:@wait4friend
    Twitter:@wait4friend
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    《敏捷开发修炼之道》学习笔记3:交付用户想要的软件
    Photoshop快捷键大集合
    如何制作已编译的HTML帮助文件(即CHM帮助文件)
    根本不存在 DIV + CSS 布局这回事
    可将视频转换成Gif动画的相关软件
    SEO是什么?与spam有什么区别呢?
    视频六大编辑软件大比拼
    陈彤:一个网络编辑的11年
    最近出现的p2psvr.exe恶意程序的解决办法
    使用火狐浏览器Firefox的一些小技巧
  • 原文地址:https://www.cnblogs.com/wait4friend/p/2708390.html
Copyright © 2011-2022 走看看