当前位置: 首页 > web >正文

oracle2kingbase的字段长度问题

实验一:
oracle中:
create table testlen(c1 varchar2(2));
insert into testlen values('山'); --成功
insert into testlen values('山西');  --失败
ORA-12899: 列 "TESTK"."TESTLEN"."C1" 的值太大 (实际值: 4, 最大值: 2)
结果:oracle中默认是按字节计算长度的。
-----------------------------------
kingbase中:
test=# select version();
version
--------------------------------------------------------------------------------
KingbaseES V008R006C009B0014 on x64, compiled by Visual C++ build 1800, 64-bit
(1 行记录)
test=# SHOW nls_length_semantics;
nls_length_semantics
----------------------
char
(1 行记录)
create table testlenc(c1 varchar2(2));
insert into testlenc values('山西'); --成功
insert into testlenc values('山西省');
ERROR:  value too large for column "public"."testlenc"."c1" (actual:3, maximum:2)

实验二:
alter system set nls_length_semantics='BYTE';
SELECT pg_reload_conf();

create table testlenb(c1 varchar2(2));
insert into testlenb values('山西');
ERROR:  value too large for column "public"."testlenb"."c1" (actual:4, maximum:2)
insert into testlenb values('山'); --成功

insert into testlenc values('山西'); --仍为成功
insert into testlenc values('山西省'); --仍为失败

SELECT column_name,data_type,character_maximum_length FROM information_schema.columns WHERE table_name = 'testlen';
column_name | data_type | character_maximum_length
-------------+-----------+--------------------------
c1          | varchar   |                        2
(1 行记录)
SELECT column_name,data_type,character_maximum_length FROM information_schema.columns WHERE table_name = 'testlenb';
column_name |  data_type  | character_maximum_length
-------------+-------------+--------------------------
c1          | varcharbyte |
(1 行记录)

实验三:
nls_length_semantics修改为byte后,采用KDTS从oracle迁移到KingbaseV8R6中:
testlen的varchar2(2)仍然是2个字符即2个汉字,并不是2个字节。
insert into testlen values('山西'); --成功
insert into testlen values('山西省'); --失败
SQL 错误 [22001]: ERROR: value too large for column "testk"."testlen"."c1" (actual:3, maximum:2)

结论:
1、kingbase中nls_length_semantics默认为char,varchar2(2)可以存放2个汉字。
2、当把nls_length_semantics改为byte后,varchar2(2)只能存放2个字节。
3、nls_length_semantics的值对创建表时起作用,与insert时无关。
所以要在迁移数据库前就确定好nls_length_semantics的值。
存在问题:
1、KDTS从oracle迁移到kingbase时,无论nls_length_semantics是什么值,oracle中的VARCHAR2(2)都会迁移为character varying(2 char),2字节成了2个字符长度。
也就是oracle中只有2字节的字段,迁移到kingbase后变成了4个字节长度。
SELECT column_name,data_type,character_maximum_length FROM information_schema.columns WHERE table_name = 'testlen';

http://www.xdnf.cn/news/15647.html

相关文章:

  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | AutoTextEffect(自动打字机)
  • 尚庭公寓-------图片上传接口
  • 【c++深入系列】:万字详解list(附模拟实现的list源码)
  • 【unitrix】 6.4 类型化数特征(t_number.rs)
  • JavaScript进阶篇——第六章 内置构造函数与内置方法
  • 21、鸿蒙Harmony Next开发:组件导航(Navigation)
  • 主机安全---开源wazuh安装
  • 【Unity】IL2CPP相关理论知识学习
  • Spring MVC中@PathVariable的用法详解
  • AR智能巡检:电力行业数字化转型的“加速器”
  • Java 8新特性 函数式编程实践
  • python基础②-数据结构
  • 第二十一 篇 PDF文档自动化:Python一键合并、分割、水印、提取与加密解密!你的PDF全能管家!
  • 《通信原理》学习笔记——第二章
  • 【前端】Vue3 前端项目实现动态显示当前系统时间
  • 【TVM 教程】FAQ
  • 筑牢网络安全防线:DDoS/CC 攻击全链路防护技术解析
  • Hadoop(三)
  • PyTorch 损失函数详解:从理论到实践
  • Qt小组件 - 7 SQL Thread Qt访问数据库ORM
  • Uniapp中双弹窗为什么无法显示?
  • 玩转Docker | 使用Docker部署bender个人导航页工具
  • 利用Java自定义格式,循环导出数据、图片到excel
  • 【论文阅读 | CVPR 2023 |CDDFuse:基于相关性驱动的双分支特征分解的多模态图像融合】
  • lua(xlua)基础知识点记录
  • 【前端】在Vue3中绘制多系列柱状图与曲线图
  • 量子比特耦合与系统集成:量子计算硬件的核心突破
  • 入门华为数通,HCIA/HCIP/HCIE该怎么选?
  • 2025年自动化工程、物联网与计算机应用国际会议(AEITCA 2025)
  • Java基础:分支/循环/数组