聊聊 oracle varchar2 字段的gbk/utf8编码格式和字段长度问题

聊聊 oracle varchar2 字段的gbk/utf8编码格式和字段长度问题

1 问题现象

最近在排查某客户现场的数据同步作业报错问题时,发现了部分 ORACLE 表的 varchar2 字段,因为上游 ORACLE数据库采用 GBK 编码格式,而下游 ORACLE 数据库采用UTF8 编码格式,导致部分包含中文的字段在插入下游是,因为长度问题导致插入失败,报错信息类似“ORA-12899: value too large for column “dbName”.“tableName”.“colName” (actual: xxx, maximum: yyy)”。
以下是详细信息。

2 问题原因

  • 上游数据库中 ORACLE 使用了 GBK 编码,而下游 ORACLE 中使用了 UTF8 编码;在 GBK 编码格式下,每个中文字符占两个字节,而在 UTF8 编码格式下,每个中文字符占三个字节;(当然两种编码格式下,英文字符都是占1个字节);
  • 在ORACLE 中通过DDL 声明 VARCHAR2 可变长度的字符串类型字段时,必须指定字段的最大长度,而长度的单位可以是字节也可以是字符,当不指定长度单位时,其默认值跟 session 级别的参数 nls_length_semantics 有关,该参数一般默认配置为字节;
  • 由于声明下游表 VARCHAR2 字段时没有指定长度单位,采用的是类似” remark VARCHAR2(2000)” 的格式,所以实际最大长度的单位是字节;如果最大长度设计不当,从上游同步包含中文字符的数据时,就可能报上述错;

3 问题解决

  • 从技术角度,建表语句也可以优化下:为确保 DDL 中指定的 VARCHAR2 字段的最大长度的语义的一致性,而不依赖 session 级别的参数 nls_length_semantics,DDL 语句中可以显示指定长度单位,比如 VARCHAR2(size BYTE) 或 VARCHAR2(size CHAR]);
  • 相关微服务负责人梳理排查下是否需要扩充下游 ORACLE VARCHAR2 字段的长度;

4 技术背景

  • 可以使用 length( ) 函数查看 VARCHAR2 字段的实际长度,此时其返回值代表的实际存储的字符的个数(每个中文和英文字符都算1个字符),而不是字节数;
  • 可以使用 lengthb( ) 函数查看 VARCHAR2 字段实际存储占用的字节数;
  • 在 GBK 编码格式下,每个中文字符占两个字节,而在 UTF8 编码格式下,每个中文字符占三个字节(当然两种编码格式下,英文字符都是占1个字节);
  • Oracle LENGTH( ) function can be defined as a function which is used to calculate the length of a string and it measures the length of the string in characters (A single string is made of many characters and the data type of the string expression can be VARCHAR2, CHAR, NCHAR, CLOB or NCLOB) as defined by the input character set and it returns a positive value upon execution which is a integer representing the number of characters present in the string.
  • V$SYSTEM_PARAMETER displays information about the initialization parameters that are currently in effect for the instance. A new session inherits parameter values from the instance-wide values.
  • V P A R A M E T E R d i s p l a y s i n f o r m a t i o n a b o u t t h e i n i t i a l i z a t i o n p a r a m e t e r s t h a t a r e c u r r e n t l y i n e f f e c t f o r t h e s e s s i o n . A n e w s e s s i o n i n h e r i t s p a r a m e t e r v a l u e s f r o m t h e i n s t a n c e − w i d e v a l u e s d i s p l a y e d b y t h e V PARAMETER displays information about the initialization parameters that are currently in effect for the session. A new session inherits parameter values from the instance-wide values displayed by the V PARAMETERdisplaysinformationabouttheinitializationparametersthatarecurrentlyineffectforthesession.AnewsessioninheritsparametervaluesfromtheinstancewidevaluesdisplayedbytheVSYSTEM_PARAMETER view.

5 相关示例SQL

select name,value from V$PARAMETER where name='nls_length_semantics';
SELECT cust_id,length(cust_id),lengthb(cust_id) FROM test2 ORDER BY lengthb(cust_id) desc ;
ALTER SESSION SET NLS_LENGTH_SEMANTICS = 'CHAR';
ALTER SESSION SET NLS_LENGTH_SEMANTICS = 'BYTE';
SELECT * FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET';
-- to check v$parameter or v$SYSTEM_PARAMETER, for normal users,they need ask the admin to grant them below access rights, or they might get erros like ORA-00942: table or view does not exist
GRANT SELECT_CATALOG_ROLE to xx;
GRANT SELECT ANY DICTIONARY to xx;
INSERT INTO xxx (CUST_ID,ORDINAL,ORGAN_FLAG,CLIENT_NAME,CLIENT_GENDER,FULL_NAME,ID_KIND,ID_NO) VALUES ('李明李明明',0,'0','姓名31288580000004726','0','wuhl','0','110101199003077117');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

封装了一个优雅的iOS转场动画

效果图 代码 // // LBTransition.m // LBWaterFallLayout_Example // // Created by mac on 2024/6/16. // Copyright © 2024 liuboliu. All rights reserved. //#import "LBTransition.h"interface LBPushAnimation:NSObject<UIViewControllerAnimated…

【服务器02】之【阿里云平台】

百度一下阿里云官网 点击注册直接使用支付宝注册可以跳过认证 成功登录后&#xff0c;点击产品 点击免费试用 点击勾选 选一个距离最近的 点满GB 注意&#xff1a;一般试用的时用的是【阿里云】&#xff0c;真正做项目时用的是【腾讯云】 现在开始学习使用&#xff1a; 首先…

串口接收不定长数据实现思路

目录 帧头帧尾标志法&#xff1a; 长度字段法&#xff1a; 超时等待法&#xff1a; 基于STM32串口中断的方法&#xff1a; 基于回调函数的方法&#xff1a; 基于定长数据的方法&#xff08;如果数据包长度固定且已知&#xff09;&#xff1a; 串口实现不定长数据接收通常…

2024年综合艺术与媒体传播国际会议(ICIAMC 2024)

2024年综合艺术与媒体传播国际会议(ICIAMC 2024) 2024 International Conference on Integrated Arts and Media Communication (ICIAMC 2024) 会议地点&#xff1a;贵阳&#xff0c;中国 网址&#xff1a;www.iciamc.com 邮箱: iciamcsub-conf.com 投稿主题请注明:ICIAMC…

Java中如何处理ArithmeticException异常?

Java中如何处理ArithmeticException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;ArithmeticException异常是开发…

【Python机器学习】DBSCAN(具有噪声的基于密度的空间聚类应用)

DBSCAN&#xff08;具有噪声的基于密度的空间聚类应用&#xff09;是一种非常有用的聚类算法&#xff0c;它的主要优点是不需要用户先验地设置簇的个数&#xff0c;可以划分具有复杂形状的簇&#xff0c;还可以找出不属于任何簇的点。DBSCAN比凝聚聚类和k均值稍慢&#xff0c;但…

常见加密方式:MD5、DES/AES、RSA、Base64

16/32位的数据&#xff0c;最有可能就是使用md5加密的 使用对称加密的时候&#xff0c;双方使用相同的私钥 私钥&#xff1a;单独请求/隐藏在前端的隐藏标签当中 二、RSA非对称密钥加密 公钥加密&#xff0c;私钥解密 私钥是通过公钥计算生成的 加密解密算法都在js源文件当…

简单了解java中的File类

1、File类 1.1、概述 File对象就表示一个路径&#xff0c;可以是文件路径也可以是文件夹路径&#xff0c;这个路径可以 是存在的&#xff0c;也可以是不存在的。 1.2、常见的构造方法 方法名称说明public File&#xff08;String pathname&#xff09;根据文件路径创建文件…

0620# C++八股记录

如何防止头文件被重复包含 1. 使用宏定义&#xff08;Include Guards&#xff09; #ifndef HEADER_FILE_NAME_H #define HEADER_FILE_NAME_H// 头文件的内容#endif // HEADER_FILE_NAME_H例如&#xff0c;假设有一个头文件名为example.h&#xff0c;可以这样编写&#xff1a;…

U盘数据恢复全攻略:从原理到实践

一、引言&#xff1a;为何U盘数据恢复至关重要 在信息化时代&#xff0c;U盘作为便携存储设备&#xff0c;广泛应用于各个领域。然而&#xff0c;U盘数据的丢失往往给个人和企业带来极大的困扰。数据丢失的原因多种多样&#xff0c;可能是误删除、格式化、文件系统损坏&#x…

session 共享、Nginx session 共享、Token、Json web Token 【JWT】等认证

.NET JWT JWT 》》Json Web Token header . payload . Signature 三部分组成 JWT 在线生成 》》 https://jwt.io/ 》》https://tooltt.com/jwt-encode/ 》》解码工具 https://tool.box3.cn/jwt.html JWT 特点 无状态 JWT不需要在服务端存储任何状态&#xff0c;客户端可以携…

【FFMPEG+Mediamtx】 本地RTSP测试推流记录

利用本地FFMPEGMediamtx 搭建本地RTSP测试推流电脑摄像头 起因 本来要用qt的qml的Video做摄像头测试。 &#x1f614;但是&#xff0c;不在现场&#xff0c;本地测试&#xff0c;又要测试rtsp流&#xff0c;又因为搜了一圈找不到一个比较好的在线测试rtsp推流网址&#x1f6…

自从用了这个 69k star 的项目,前端小姐姐再也不催我了

一般在开发前后端分离的项目时&#xff0c;双方会定义好前后端交互的 http 接口&#xff0c;根据接口文档各自进行开发。这样并行开发互不耽误&#xff0c;开发好后做个联调就可以提测了。 不过最近也不知道怎么回事&#xff0c;公司新来的前端小姐姐总是在刚开始开发的时候就…

全行业通用商城小程序源码

一站式购物新体验 一、引言&#xff1a;开启数字化购物新时代 在数字化快速发展的今天&#xff0c;小程序成为了商家们连接消费者的重要桥梁。特别是“全行业通用商城小程序”&#xff0c;以其便捷的购物体验和多样化的功能&#xff0c;成为了越来越多商家和消费者的首选。本…

嵌入式STM32F103项目实例可以按照以下步骤进行构建和实现

嵌入式STM32F103项目实例可以按照以下步骤进行构建和实现&#xff1a; 1. 项目概述 目标&#xff1a;演示STM32F103开发板的基本功能&#xff0c;通过LED闪烁来实现。硬件需求&#xff1a;STM32F103开发板、LED灯、杜邦线、USB转串口模块&#xff08;可选&#xff0c;用于调试…

Day12 单调栈 下一个最大元素

503. 下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数…

[AIGC] 动态规划的类型以及在 LeetCode 上的应用

动态规划是一种解决问题的优秀策略&#xff0c;它适用于涉及优化问题、组合问题及最短路径问题等领域。下面我们来探究几类常见的动态规划问题&#xff0c;并提供相应的 LeetCode 题目以及 Java 代码实现。 文章目录 1. 一维动态规划2. 二维动态规划3. 背包型动态规划 1. 一维动…

Unity URP简单烘焙场景步骤

Unity URP简单烘焙场景步骤 前言项目场景布置灯光模型Lighting设置环境设置烘焙前烘焙后增加角色 问题解决黑斑硬边清理缓存 参考 前言 项目中要烘焙一个3D场景&#xff0c;用的URP渲染管线&#xff0c;简单记录一下。 项目 场景布置 灯光 因为场景中有能动的东西&#xf…

JAVA每日作业day6.24

ok了家人们今天学习了一些关键字&#xff0c;用法和注意事项&#xff0c;静态代码块这些知识&#xff0c;闲话少叙我们一起看看吧。 一&#xff0c;final关键字 1.1 final关键字的概述 final&#xff1a; 不可改变。可以用于修饰类、方法和变量。 类&#xff1a;被修饰的类&a…

GPT-5 一年半后发布?对此你有何期待?

GPT-5的即将发布无疑引发了广泛的关注和讨论。以下是一些对GPT-5潜在影响和应用场景的见解和期待&#xff1a; 1. 提升工作效率 GPT-5可能会在很多领域进一步提升工作效率。其“博士级”智能在特定任务上的表现可以帮助专业人士更快地完成复杂的工作。例如&#xff0c;在法律…