解决Oracle11g的SQL Loader(sqlldr)命令行中文乱码问题

news/2024/7/3 13:35:35 标签: linux, 数据库, Oracle, sqlldr, 乱码

文章目录

  • (一)现象
  • (二)分析
    • (2.1)入库文件字符集?(No)
    • (2.2)客户端设置?(Yes)
    • (2.3)分析NLS_LANG设置
  • (三)解决(无奈)

(一)现象

程序在Linux下调用sqlldr时,发现其返回的命令行内容存在乱码
手动测试sqlldr命令,果然是乱码
仔细检查发现是GBK格式,因为Linux下基本都默认UTF8编码,所以直接终端显示就变乱码了。

$shion@shionwsl ~> sqlldr

SQL*Loader: Release 11.2.0.4.0 - Production on ������ 4�� 27 09:08:30 2023
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

�÷�: SQLLDR keyword=value [,keyword=value,...]

��Ч�Ĺؼ���:

    userid -- ORACLE �û���/����
   control -- �����ļ���
       log -- ��־�ļ���
       bad -- �����ļ���
      data -- �����ļ���
   discard -- �����ļ���
   ......

回到Windows下调用同版本sqlldr,正常显示:

PS C:\Users\Shion> sqlldr

SQL*Loader: Release 11.2.0.4.0 - Production on 星期四 427 09:11:50 2023
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

用法: SQLLDR keyword=value [,keyword=value,...]

有效的关键字:

    userid -- ORACLE 用户名/口令
   control -- 控制文件名
       log -- 日志文件名
       bad -- 错误文件名
      data -- 数据文件名
   discard -- 废弃文件名
   ......

(二)分析

(2.1)入库文件字符集?(No)

我们都知道,文件内容如果带有中文是有编码的,所以调用sqlldr入库时,需要指定其编码。
这部分在控制文件.ctl中完成。
如下例,指定了ZHS16GBK 编码方式:

OPTIONS (skip=0) LOAD DATA CHARACTERSET ZHS16GBK 
INFILE 'xxxxx/eps.txt' 
APPEND INTO TABLE yyyyy 
FIELDS TERMINATED BY X'09' 
TRAILING NULLCOLS 
(xxxx char(16),yyyy,zzzz,......)

会不会因为导入的文件都是GBK编码影响了sqlldr的命令行输出呢?当然不是!!!
因为我们只输入了sqlldr命令本身,没有任何参数,中文已经是乱码了。

(2.2)客户端设置?(Yes)

既然Windows和Linux都输出GBK,而不是尊重操作系统的字符集(编码)……
那么是不是因为同样的客户端设置引起的呢?
两边都设置了:

NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

尝试将Linux那边改为SIMPLIFIED CHINESE_CHINA.AL32UTF8
再调用sqlldr,果然没有乱码了。但 问题并没有解决!!!

因为Oracle客户端设置是需要和服务端一致的,既然服务端是GBK而客户端改为了UTF8,会导致你用SQL选出的中文变成乱码。这是Oracle一个很神奇的设置,它完全不考虑你需要同时连接2个不同字符集服务端的情况。Java已经不再读这个客户端配置,但也引发了其它的问题(之前有遇到过并记录到了文章)。

那怎么办呢?

(2.3)分析NLS_LANG设置

我们来看一下(当然还有很多其它国家和语言/字符集设置):

NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
NLS_LANG=JAPANESE_JAPAN.AL32UTF8
NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P15
......

NLS_LANG的值,明显分为两部分:
中间用点连接,格式为:NLS_LANG=语言_国家 . 字符集

  1. 语言和国家
  2. 字符集(编码方式)

现在的问题是:

  • sqlldr的命令行显示,不尊重操作系统字符集,而是采用了NLS_LANG的字符集
  • 这个客户端的字符集设置又必须和服务端一致不能随便改。
  • Linux操作系统字符集是UTF8和ORACLE客户端字符集GBK不一样,导致冲突。

所以?改Linux操作系统字符集?当然不能!!!
随便改操作系统字符集,无异于单表有乱码改整个数据库字符集!!!
在生产系统中毫不考虑还其它程序在跑,⚠️属于破坏行为。
量刑标准我不清楚,同时一般人权限也不够。

(三)解决(无奈)

由于Oracle自身的设定的原因,通常情况下Linux的UTF8Oracle服务端要求的GBK编码一定冲突。
用程序读取很简单,创建流读取命令行输出信息时,指定成NLS_LANG同样的编码就OK了。

但是人敲命令行怎么办呢???
只能看乱码么,还是每次设法转成看GBK?

刚才提到了既然分两部分,第二部分不能改,就只能看第一部分了,也就是语言_国家设置。
那就只能把语言改为任何编码下都能正常显示的语言:英语了。

NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

谁说米国人不能说中文呢?
设置后如下,同时还解决了翻译成中文后看不懂的问题(手动狗头)。

$shion@shionwsl ~> sqlldr

SQL*Loader: Release 11.2.0.4.0 - Production on Thu Apr 27 10:01:24 2023
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Usage: SQLLDR keyword=value [,keyword=value,...]

Valid Keywords:

    userid -- ORACLE username/password
   control -- control file name
       log -- log file name
       bad -- bad file name
      data -- data file name
   discard -- discard file name
   ......

http://www.niftyadmin.cn/n/267897.html

相关文章

星辰天合亮相 2023 国际金融展,软件定义存储信创方案备受瞩目

4 月 25 日,为期三天的 2023 中国国际金融展在北京首钢会展中心开幕,本届展会以“荟萃金融科技成果,展现数字金融力量,谱写金融服务中国式现代化新篇章”为主题,全面展示金融业为完善科技创新体系、加快实现高水平科技…

Jsp网上购书系统设计(源代码+论文)

本文研究了一种基于数据关联规则网上书店系统,此方案与现今网上已采用的一些方案相比,具有用户使用更简单、界面更直观等优点。网上书店在我国刚起步,但发展很快。随着我国互联网的更加普及和网上书店的更趋成熟,会有越来越大的消…

MySQL——存储过程和函数从零基础到入门必学教程(涵盖基础实战)

文章目录 目录 文章目录 前言 一、创建存储过程 二、在存储过程中使用变量 1.定义变量 2.为变量赋值 三、光标的使用 1.打开光标 2.打开光标 3.使用光标 4.关闭光标 四、流程控制的作用 1.IF语句 2.CASE语句 3.LOOP语句 4.LEAVE语句 5.ITERATE语句 6.REPEAT语…

基于html+css的图展示44

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

3自由度并联绘图机器人实现写字功能(二)

1. 功能说明 本文示例将实现R305b样机3自由度并联绘图机器人写字的功能。本实验使用的样机是用探索者兼容零件制作的。 2. 电子硬件 在这个示例中,采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno) 扩…

AI(二):初体验(Cursor、Copilot、Bito)

Cursor Cursor官网下载:https://www.cursor.so/ && https://github.com/getcursor/cursor Cursor.so是一款基于GPT的代码生成工具,它可以帮助开发者快速生成代码,提高开发效率。GPT是一种自然语言处理技术,可以根据输入…

Vue3之setup参数介绍

setup(props, context) {... }一、参数 使用setup函数时,它将接受两个参数: propscontext 让我们更深入地研究如何使用每个参数 二、Props setup函数中的第一个参数是props。正如在一个标准组件中所期望的那样,setup函数中的props是响应…

【SpringBoot基础】SpringBoot集成数据库连接池

文章目录 1. 什么是数据库连接池?2. 为什么要使用数据库连接池?3. 数据库连接池的基本概念4. 数据库连接池的原理5. 数据库连接池示例 1. 什么是数据库连接池? 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使…