疑难Tips:解决 SQL*Plus 中工具插入中文数据到Oracle数据库报错及乱码问题

news/2025/1/20 0:53:56/

eb88136e2c88947077e35ea895abd580.gif

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]

解决在 sqlplus 命令行中插入 Oracle 中文数据报错及乱码问题 

错误信息:在 sqlplus 命令行中执行下述插入语句,报 ORA-01756: quoted string not properly terminated ,以及乱码问题。

SQL> insert into test(id,name) values (6,'Oracle关系型数据库');
ERROR:
ORA-01756: quoted string not properly terminated

问题原因:可将上述两个问题合并到一起解决,问题1解决了,问题2自然也就解决了。前者是由于在 sqlplus 命令行中插入中文数据时,由于使用的 XSHELL 或者 MobaXterm 终端(作者环境)的客户端字符集不一致,插入中文时会经行转码,导致某些字符串可能转成中文符号导致sql出现错误,后者则sqlplus客户端使用的编码和服务器端编码不一致导致乱码。

问题解决

  • 1.查看数据库服务端字符集,客户端编码以及当前会话的字符集,NLS_LANG 的组成规则为 NLS_LANGUAGE_NLS_TERRITORY.NLS_CHARACTERSET 。

-- 1.查看数据库服务端字符集
SELECT userenv('language') FROM dual;  -- AMERICAN_AMERICA.ZHS16GBK
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_LANGUAGE', 'NLS_TERRITORY', 'NLS_CHARACTERSET');
-- NLS_CHARACTERSET ZHS16GBK
-- NLS_TERRITORY AMERICA
-- NLS_LANGUAGE AMERICAN-- 2.查看sqlplus客户端编码
SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER IN ('NLS_LANGUAGE', 'NLS_TERRITORY', 'NLS_CHARACTERSET');
-- NLS_LANGUAGE         AMERICAN
-- NLS_TERRITORY        AMERICA
-- NLS_CHARACTERSET     ZHS16GBK-- 3.查看当前会话的字符集
SELECT * FROM nls_session_parameters  WHERE parameter in ( 'NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');
-- NLS_LANGUAGE  AMERICAN
-- NLS_TERRITORY  AMERICA
  • 2.修改 MobaXterm 终端工具字符集,并将其设置为 gbk , 重新打开终端在MobaXterm终端上执行 export LANG=zh_CN.GBK , 需根据数据库实际编码调整。


cf493a4f599fddf40458c0c63a216f99.png


weiyigeek.top-修改 MobaXterm 终端工具字符集图
  • 3.使用 MobaXterm 连接的是远程服务器,若远程服务器存在字符编码问题,我们还可以在远程服务器上修改系统字符集。

declare -x LANG="zh_CN.gbk"
declare -x LC_ALL="zh_CN.gbk"
  • 4.最后远程服务器设置 sqlplus 客户端字符集,使其与服务端保持一致。

    • Linux 环境:执行 export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK 命令,或者将此命令放于 Oracle 用户的Shell启动 .bash_profile 中,并执行 source ~/.bash_profile 使之生效。

    • Windows 环境:计算机->属性->高级系统设置->环境变量->新建 NLS_LANG 变量 ,变量值设置为 AMERICAN_AMERICA.ZHS16GBK  或者 执行 set nls_lang=american_america.ZHS16GBK 命令。

验证配置

set headingoff
set line 300 pagesize 999
truncatetabletest;  -- 清空表数据
insertintotest(id,name) values (1, '关系型数据库');
insertintotest(id,name) values (2, 'MySQL');
insertintotest(id,name) values (3, 'Oracle');
insertintotest(id,name) values (4, '"达梦数据库"');
insertintotest(id,name) values (5, '中文测试');
updatetestsetname = '"DM达梦数据库"'whereid=5;-- 若然不行,则使用最终大法绑定变量来插入中文数据
VARIABLE v_id NUMBER;
VARIABLE v_name VARCHAR2(100);
EXEC :v_id := 6;   -- PL/SQL 过程已成功完成。
EXEC :v_name := '中文测试';  -- PL/SQL procedure successfully completed.
INSERTINTOtest(id,name) VALUES (:v_id,:v_name);
1 row created.-- 测试结果:
SQL> select * fromtest;1 关系型数据库2 MySQL3 Oracle5 "DM达梦数据库"4 "达梦数据库"6 中文测试
6 rows selected.
SQL> commit;
Commit complete.

aa4409e5458e0e9b7b570558b534413c.png

weiyigeek.top-解决sqlplus插入中文及乱码问题图

知识扩展:使用 Navicat Premium 连接 Oracle 数据库,在 Navicat Premium 中插入中文数据在 sqlplus 命令行中查询是乱码,解决办法如下:编辑 Oracle 连接配置,设置客户端字符集 为 ZHS16GBK 编码默认为 65001 (UTF-8),保存后重新连接即可, 插入两条中文数据测试。

41ca39b3912f0e3b496423df0bbf426c.png

weiyigeek.top-解决navicat插入中文乱码问题图

“苦海无边,学海无涯”

关注作者学习更多实用DBA实用技巧!

若文章写得不错,不要吝惜手中转发,点赞、在看,若有疑问的小伙伴,可在评论区留言你想法哟💬!

温馨提示:作者最近10年的工作学习笔记(涉及网络、安全、运维、开发),需要学习实践笔记的看友,可添加作者账号[WeiyiGeeker],当前价格¥199,除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持,希望大家多多支持,收获定大于付出!

3b868703fb5173456e0ad5d7de4ab50e.png


如果此篇文章对你有帮助,请你将它转发给更多的人! 

 学习推荐 往期文章

  • 🔥【最新】独有连接,隐私无忧:节点小宝的安全守护

  • 🔥【最新】运维Tips:如何在 macOS、FreeBSD、Linux、Windows、Cisco 和 VMware 上添加静态路由

  • 💡【相关】DBA | 如何将 .mdf 与 .ldf 的数据库文件导入到SQL Server 数据库中?

  • 💡【相关】DBA | 如何将 .bak 的数据库备份文件导入到SQL Server 数据库中?

  • 💡【相关】DBA  | 炼气期,数据库技术基础知识概述!

fc73b5d4fd8d9296cc07630cb6915eb0.gif

54543a68f339467f910c018af6163098.gif


http://www.ppmy.cn/news/1564536.html

相关文章

学习笔记081——如何备份服务器中MySQL数据库数据?

方法: 可以通过编写sh脚本的方式,结合Linux中的crontab定时任务来实现定时备份数据的功能。 sh脚本如下: #!/bin/bash# 要备份的数据库 DB_NAME"wms" # 数据库账号 DB_USER"root" # 数据库密码 DB_PASSWORD"12345…

【数据分享】1929-2024年全球站点的逐日平均气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据!本次我们为大家带来的就是具体到气象监…

lua下标是可以从0开始

故事背景,策划搞了一个功能配置表,我看居然是0开始的,功能也正常。于是测试了下,还真的可以。网上看了资料确实可以,但是也有需要注意的问题 local test {[0] 0} for k,v in pairs(test)doprint(k,v) endhttps://bl…

C#中如何使用异步编程

在 C# 中,异步编程主要通过 async 和 await 关键字来实现。异步编程的目的是让程序在执行耗时操作(如 I/O 操作、网络请求等)时不会阻塞主线程,从而提高程序的性能。 1. 异步编程的核心概念 async 关键字 用于标记一个方法为异步方…

Java 静态导入:规则、实践与应用场景

Java 编程中,“静态导入”(import static)自 Java 5 引入,是提升代码可读性和编写效率的技巧。但需正确恰当使用。本文探讨其机制、规则、常见错误及在实际开发中的应用。 1. 静态导入介绍 静态导入可让开发者直接访问其他类或接…

LeetCode --- 432周赛

题目列表 3417. 跳过交替单元格的之字形遍历 3418. 机器人可以获得的最大金币数 3419. 图的最大边权的最小值 3420. 统计 K 次操作以内得到非递减子数组的数目 一、跳过交替单元格的之字形遍历 ​​ 题目要求 “之” 字形遍历数组,具体规律如下 具体代码如下 c…

(一)相机标定——四大坐标系的介绍、对应转换、畸变原理以及OpenCV完整代码实战(C++版)

一、四大坐标系介绍 1,世界坐标系 从这个世界(world)的视角来看物体 世界坐标系是3D空间坐标,每个点的位置用 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw​,Yw​,Zw​)表示 2,相机坐标系 相机本身具有一个坐标系&…

技术洞察:C++在后端开发中的前沿趋势与社会影响

文章目录 引言C在后端开发中的前沿趋势1. 高性能计算的需求2. 微服务架构的兴起3. 跨平台开发的便利性 跨领域技术融合与创新实践1. C与人工智能的结合2. C与区块链技术的融合 C对社会与人文的影响1. 提升生产力与创新能力2. 促进技术教育与人才培养3. 技术与人文的深度融合 结…