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

news2024/10/7 18:25:27

聊聊 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.coloradmin.cn/o/1846810.html

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

相关文章

【功能详解】银河麒麟操作系统“安全启动”是如何发挥作用的?

2023年12月,财政部、工信部发布了7项信息类产品《政府采购需求标准》,为包括操作系统在内多项产品的政府集中采购提供政策支撑。其中,安全、可信作为国产操作系统的基本要求备受关注。 安全体系的构建离不开操作系统本身的硬实力&#xff0c…

[【机器学习】深度概率模型(DPM)原理和文本分类实践

1.引言 1.1.DPM模型简介 深度概率模型(Deep Probabilistic Models) 是结合了深度学习和概率论的一类模型。这类模型通过使用深度学习架构(如神经网络)来构建复杂的概率分布,从而能够处理不确定性并进行预测。深度概率…

MQTT协议详解:物联网通信的高效解决方案(附带代码示例)

什么是MQTT协议 MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅模式的轻量级通信协议,专为资源受限的设备和低带宽、不稳定的网络设计。MQTT协议由IBM开发,现已成为物联网(IoT)领域的标准协…

顶顶通呼叫中心中间件-替换授权文件使授权文件生效指南

一、登录my.ddrj.com下载授权文件 登录地址:用户-顶顶通授权管理系统 登录之后正式授权然后点击查看把license.json下载下来,然后替换到fs的授权文件路径,默认路径是:/ddt/fs/conf 如果安装路径不一样就需要自己去看看授权文件存…

抖音商城618好物节消费数据报告发布,带货成交额同比增长300%

6月21日,“抖音商城618好物节”消费数据报告发布,呈现618期间平台全域经营情况及大众消费趋势。 今年618大促活动中,抖音电商投入流量资源和消费券,鼓励商家、达人双向经营货架场景和内容场景,不断激活消费市场。 报…

丰臣秀吉-读书笔记五

如今直面自己一生中的最高点,加之平日里的觉悟与希冀,此时此地他“一定要死得其所”。 “武士之道,便是在死的瞬间决定一生或华或实。一生谨慎、千锤百炼,如果在死亡这条路上一步走错,那么一生的言行便全部失去真意&am…

ELK+Filebeat+kafka+zookeeper构建海量日志分析平台

ELK是什么(What)? ELK组件介绍 ELK 是ElasticSearch开源生态中提供的一套完整日志收集、分析以及展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash 和 Kibana。除此之外,FileBeat也是…

智赢选品,OZON数据分析选品利器丨萌啦OZON数据

在电商行业的激烈竞争中,如何快速准确地把握市场动态、洞察消费者需求、实现精准选品,是每个电商卖家都面临的挑战。而在这个数据驱动的时代,一款强大的数据分析工具无疑是电商卖家们的得力助手。今天,我们就来聊聊这样一款选品利…

阐述一下Golang中defer的原理

基本用法 在Go语言中,defer关键字用于在函数返回前执行一段代码或调用一个清理函数。这对于处理文件关闭、解锁或者返回一些资源到资源池等操作非常有用。 其基本用法如下所示: package mainimport "fmt"func main() {example() }func exam…

解决uniapp h5 本地代理实现跨域访问及如何配置开发环境

🧑‍💻 写在开头 点赞 收藏 学会🤣🤣🤣 如何解决uniapp H5本地代理实现跨域访问? 1.第一种解决方法: 直接创建一个vue.config.js文件,并在里面配置devServer,直接上…

Transformer预测 | 基于Transformer的风电功率多变量时间序列预测(Matlab)

文章目录 预测效果文章概述模型描述程序设计参考资料预测效果 文章概述 Transformer预测 | 基于Transformer的风电功率多变量时间序列预测(Matlab) Transformer 模型本质上都是预训练语言模型,大都采用自监督学习 (Self-supervised learning) 的方式在大量生语料上进行训练,…

国产基于Vue+Echarts 免费开源 AIoT 物联网可视化Web组态大屏解决方案

项目源码,文末联系小编 01 DataRoom可视化大屏开发工具 DataRoom是一款基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的大屏设计器,前后端一体化架构,拥有几十种炫酷图表。具备大屏分组管理、大屏设计、大屏预览能力&…

Marin说PCB之如何在CST仿真软件中添加三端子的电容模型?

上期文章小编我给诸位道友们分享了Murata家的三端子电容的一些特性,这期文章接着上回把三端子电容模型如何在CST软件中搭建给大家分享一下,小编我辛辛苦苦兢兢业业的给各位帖子们免费分享我的一些设计心得,这些按照小编我华山派门派的要求都是…

chrome浏览器 network 显示感叹号(chrome network thinttling is enabled)

chrome浏览器上network出现一个黄色感叹号,鼠标移上去提示chrome network thinttling is enabled,这是因为开启了节流模式,直接把网络模式改为no throttling(有的浏览器为online)就可以了。 ##Tips: 1、n…

JavaScript的学习之强制类型转换

目录 一、什么是强制类型转换 二、其他类型转化为String类型 方式一:调用被转化数据类型的toString()方法 方式二:调用String函数,并将我们要转换的数据添加进去为参数 三、其他类型转化为Number类型 方式一:使用Number()函数…

云渲染与传统渲染器的较量与融合

随着云计算技术的突破性进展,云渲染技术应运而生,为传统渲染器带来了前所未有的挑战与机遇。云渲染,以其在计算资源、可扩展性、协作便利性等方面的显著优势,正在重新定义渲染行业的标准。云渲染与传统渲染器之间的核心差异&#…

【机器学习】Lasso回归:稀疏建模与特征选择的艺术

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 Lasso回归:稀疏建模与特征选择的艺术引言一、Lasso回归简介1.1 基本…

人脸识别——可解释的人脸识别(XFR)人脸识别模型是根据什么来识别个人的

可解释性人脸识别(XFR)? 人脸识别有一个任务叫1:N(识别)。这个任务将一个人的照片与N张注册照片进行比较,找出相似度最高的人。 这项任务用于刑事调查和出入境点。在犯罪调查中,任务从监控摄像…

【文心智能体大赛】迎接属于你的休闲娱乐导师!

迎接属于你的休闲娱乐导师! 前言创建智能体发布智能体最后结语 前言 文心智能体平台AgentBuilder 是百度推出的基于文心大模型的智能体(Agent)平台,支持广大开发者根据自身行业领域、应用场景,选取不同类型的开发方式&…

02 Shell 编程之条件语句

目录 2.1 条件测试语句 2.1.1 文件测试 2.1.2 整数值比较 2.1.3 字符串比较 2.1.4 逻辑测试 2.2 if 条件语句 2.2.1 if 语句的结构 1. 单分支if 语句 2. 双分支if 语句 3. 多分支if 语句 2.2.2 if 语句应用示例 1. 单分支if 语句应用 2. 双分支if 语句应用 3. 多分支if 语句应…