目录

一、实例设置方法

二、各参数设置不同值的区别

1. 页大小

2. 簇大小

3. 标识符大小写敏感

4. 字符集选项

5. VARCHAR 类型长度是否以字符为单位


一、实例设置方法

达梦数据库利用./dminit进行数据库实例参数设置

./dminit help (查看可配置参数)

其中页大小 (page_size)、簇大小 (extent_size)、大小写敏感 (case_sensitive)、字符集 (charset) 这四个参数,一旦确定无法修改,需谨慎设置。下表为这几个参数的具体含义:

名称

含义

可设置值

page_size

数据文件使用的页大小

4/8/16/32

extent_size

簇大小,每次分配新的段空间时连续的页数

16/32/64

case_sensitive

标识符大小写敏感。当大小写敏感时,小写的标识符要用双引号括起,否则被转换为大写;当大小写不敏感时,系统不自动转换标识符的大小写,在标识符比较时也不区分大小写。

Y/y/N/n/1/0(默认为Y)

charset

字符集选项,0 代表 GB18030;1 代表 UTF-8;2 代表韩文字符集 EUC-KR

0/1/2(默认为0)

length_in_char

VARCHAR 类型长度是否以字符为单位

Y/N,1/0(默认为N)

例如:

./dminit path=/dm8/data PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=y

CHARSET=1 DB_NAME=DMDB INSTANCE_NAME=DBSERVER PORT_NUM=5236

上述语句表示:设置页大小为 32 KB,簇大小为 32 KB,大小写敏感,字符集为 utf-8,数据库名为 DMDB,实例名为 DBSERVER,端口为 5236。

接下来主要介绍页大小、大小写敏感、字符集选项和VARCHAR 类型长度是否以字符为单位,当它们设置不同值的时候的具体区别。

二、各参数设置不同值的区别

1. 页大小

DM数据库中的页大小可以为 4KB、8KB、16KB 或者 32KB,用户在创建数据库时可以指定,默认大小为 8KB,一旦创建好了数据库,在该库的整个生命周期内,页大小都不能够改变。页大小对字符数据类型实际最大长度及每行记录的影响如下表所示(不同的数据库版本略有差异),每条记录总长度不能大于页面大小的一半。

数据库页大小

每个字符类型字段实际最大长度(字节)

每行记录除大字段外其他字段总长度(字节)

4K

1900

2000

8K

3900

4000

16K

8000

8000

32K

8188

16000

例如:采用默认的8K进行初始化数据库,测试用例如下:

创建表:

create table t1 (c1 varchar2(8100),c2 varchar2(8100));

插入数据:
declare
v varchar2(8100);
v_sql varchar2(8100);
begin
v:='a';
for i in 1..4000
loop
v:=v||'a';
end loop;
v_sql:='insert into t1(c1) VALUES ('''||v||''')';
print(v_sql);
execute immediate v_sql;
commit;
end;

运行结果:

docker达梦数据库字符集 达梦数据库设置字符集_docker达梦数据库字符集

2. 簇大小

簇是进行存储空间分配的基本单位。一个簇是由一系列逻辑上连续的数据页组成的逻辑存储结构。因此,簇是数据页的上级逻辑单元 ,由同一个数据文件中 16 个或 32 个连续的数据页组成。即每次分配新的段空间时连续的页数。没有特殊需求默认16就可以。

3. 标识符大小写敏感

case_sensitive参数用来设置字符串比较是否大小写敏感,用于确定数据库对象及数据是否区分大小写,默认为区分,不可更改。根本目的是为了兼容不同的数据库,从MYSQL和SQLSERVER 迁移过来的系统,建议使用大小写不敏感;从 ORACLE迁移过来的系统,建议使用大小写敏感,以便和原来系统匹配。

例如进行如如下测试:

创建表t1:

create table t1(a1 char(10));
insert into t1 values(‘a’);
insert into t2 values(‘A’);
commit;

首先测试对表中内容的影响,初始化数据库采用大小写敏感,查询表t1:

select count(*) from t1 where a1=’a’;   ---查询成功,结果为1

select count(*) from t1 where a1=’A’;   ---查询成功,结果为1

初始化数据库采用大小写不敏感,查询表t1:

select count(*) from t1 where a1=’a’;   ---查询成功,结果为2

select count(*) from t1 where a1=’A’;   ---查询成功,结果为2

再测试对对象名的影响:

在大小写敏感时:

创建对象:

create table a(a1 int);  ---执行成功

select * from a;     ---执行成功

select * from A;      ---执行成功

select * from “a”;     ---执行失败:无效的表或视图名[A]

select * from “A”;     ---执行成功
create table “b”(a1 int); ---执行成功

select * from b;       ---执行失败:无效的表或视图名[B]

select * from “b”;     ---执行成功

select * from B;       ---执行失败:无效的表或视图名[B]

select * from “B”;     ---执行失败:无效的表或视图名[B]
在大小写不敏感时:

create table a(a1 int);  ---执行成功

select * from a;        ---执行成功

select * from A;         ---执行成功

select * from “a”;     ---执行成功

select * from “A”;     ---执行成功
create table “b”(a1 int); ---执行成功

select * from b;            ---执行成功

select * from “b”;        ---执行成功

select * from B;            ---执行成功

select * from “B”;         ---执行成功

由此可见,大小写不敏感时,双引号并不影响对象名。

4. 字符集选项

一般使用GB18030,GB18030 数字字母占 1 个字节,普通汉字占 2 个字节,部分繁体及少数民族文字占 4 字节。如果需要国际字符可以采用 Unicode,Unicode 在达梦中采用 UTF-8 编码格式,欧洲的字母字符占 1 到 2 个字节,亚洲的大部分字符占 3 个字节,附加字符为 4 个字节。如果只存储中文和字母数字,GB18030更节省空间些。

例如字符集选项为GB18030和UTF-8时,查看字母字符和汉字字符所占的字节长度:

字符集选项为GB18030

--建表

create table t1(c1 varchar(10));

--插入数据

insert into t1 values('a');
insert into t1 values('一');
insert into t1 values('二');
commit;

--查看所占字节长度

select c1,lengthb(c1),(ascii(c1)) from t1;

运行结果:

docker达梦数据库字符集 达梦数据库设置字符集_dba_02

字符集选项为UTF-8时,运行以上代码

docker达梦数据库字符集 达梦数据库设置字符集_docker达梦数据库字符集_03

5. VARCHAR 类型长度是否以字符为单位

该参数的作用是建表时VARCHAR的长度是按照字符计算还是字节计算,默认以字节为单位,即字段的长度单位按照字节计算。如果采用字符为单位,字段的长度单位按照字符来计算,不同的字符集会导致字段长度不一样,实际最大长度受到页大小的限制。建议采用默认以字节为单位,如果从 MYSQL 迁移的同时又不方便扩大表结构的长度,需要设置为以字符为单位。

例如:在字符集为 gb18030,varchar 长度以字节为单位时

运行以下代码:

create table t2(name VARCHAR(3));

insert into t2 values('一');

commit;                   ---执行成功

insert into t2 values('一二');

commit;                   ---执行失败,列[NAME]长度超出定义

在字符集为UTF-8,varchar 长度以字符为单位时

create table t2(name VARCHAR(3));

insert into t2 values('一');

commit;                   ---执行成功

insert into t2 values('一二');

commit;                   ---执行成功

如果还有任何问题,欢迎到达梦云适配中心提问哦!