目录
一、实例设置方法
二、各参数设置不同值的区别
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;
运行结果:
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;
运行结果:
字符集选项为UTF-8时,运行以上代码
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; ---执行成功
如果还有任何问题,欢迎到达梦云适配中心提问哦!