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

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.dtcms.com/a/283491.html

相关文章:

  • STM32外设介绍4(ADC)
  • Windows11怎样禁止应用开机启动
  • 评估遥感云雾浓度的无参化指标(适用于其它合成雾的场景)
  • 【JVM】内存分配与回收原则
  • leetcode 3201. 找出有效子序列的最大长度 I II
  • 演示数据库操作
  • 测试学习之——Pytest Day2
  • 《十万线段绘乾坤:Canvas离屏渲染深度剖析》
  • 低代码深度切入制造业需求的实践路径
  • 在 CentOS 8 上彻底卸载 Kubernetes(k8s)
  • 每日钉钉API探索:requestAuthCode网页应用(H5微应用)免登授权
  • 【leetcode】1422. 分割字符串的最大得分
  • 创建SprngBoot项目的四种方式
  • FreeRTOS中断管理STM32
  • 【Java】【力扣】20.有效的括号
  • 基于迁移学习的培养基配方开发方法
  • XSS-LABS的Level1-8
  • Python —— 真题三
  • NumPy 详解
  • 【static 修饰局部变量、全局变量、函数】
  • Swift6.0 - 5、基本运算符
  • 账户和组管理
  • JavaEE——死锁
  • PowerBI实现仅在需要图表时显示图表
  • 傅里叶变换算子性质证明
  • GTSuite许可管理常见问题及解决方案
  • 基于FPGA的IIC控制EEPROM读写(1)
  • Mybatis07-逆向工程
  • 《python语言程序设计》2018版第8章5题编写函数统计特定不重复字符串s2在s1中的出现次数
  • C#获取当前系统账户是否为管理员账户