實驗一:
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';