达梦提供图形化和命令行两种方式创建数据库。建库过程中包含若干不可修改参数,在初始化完成后将不能再调整,包括以下五种一旦指定,数据库初始化完成后将无法更改可保持与源库一致的参数以减少兼容性风险。
| 项目 | 说明 |
|---|---|
| 页(Page) | 最小存储单位、最小IO单元 |
| 簇(Extent) | 最小分配单位 |
| 字符集 | GB18030、UTF-8 等 |
| 字符串比较 | 默认区分大小写,“A”和“a”是不同对象和字符。 |
| 行尾空格填充模式 | 字符串比较时是否忽略结尾空格 |
| 页面大小 | 最大行长度(约) |
|---|---|
| 4K | 1900 |
| 8K | 3900 |
| 16K | 8000 |
| 32K | 16000 |
表空间添加数据文件有最小要求,否则会报错,如8K的页大小最少添加数据文件大小是8K*4096=32MB,最小数据文件大小为:
4096 × 页大小
8K*4096/1024=32MB
16K*4096/1024=64MB
32K*4096/1024=128MB
取值:0代表GB18030,1代表UTF-8,2代表韩文字符集EUC-KR。默认为0。
GB18030是中国国家标准(强制性标准)编码向下兼容GBK和GB2312,支持完整的Unicode字符集。GB18030数字字母占1个字节,普通汉字占2个字节,部分繁体及少数民族文字占4字节,欧洲的字母字符占1到2个字节,亚洲的大部分字符占3个字节,扩展字符为4个字节。如果只存储中文和字母数字,一般来说GB18030更节省空间。
<font style="color:#DF2A3F;">汉字存储效率较高(常用字 2字节)如果只存储中文、字母和数字,GB18030更节省空间。</font>
UTF-8(Unicode Transformation Format-8bit)是国际编码,包含全世界需要用到的所有字符,通用性强。 UTF-8是一种多字节编码,英文使用8位(即一个字节),中文使用24位(三个字节)来编码。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示,直接对应 Unicode 码点,转换极快,适用于国际化应用。
<font style="color:#DF2A3F;">适用国际化应用(需支持多语言)、Web API、移动应用、云服务、开源软件.跨平台系统等。</font>
示例(UTF-8 字符长度):
-- GB18030 GLOBAL_CHARSET = 0
SELECT length('李宁-panda'); -- 8
-- UTF-8 GLOBAL_CHARSET = 1
PARA_NAME PARA_VALUE DEFAULT_VALUE SESS_VALUE FILE_VALUE PARA_TYPE PARA_MODULE DESCRIPTION
-------------- ---------- ------------- ---------- ---------- --------- ----------- --------------
GLOBAL_CHARSET 1 0 1 0 READ ONLY mem only global_charset
SELECT lengthb('李宁-panda'); -- 12(两中文=6字节 + 英文=6字节)
大小写敏感为实例级参数。建库时通过 dminit 设置,创建完成后不可修改。
参数说明:
| 参数 | 含义 |
|---|---|
| CASE_SENSITIVE = Y(默认) | 区分大小写 |
| CASE_SENSITIVE = N | 不区分大小写 |
CASE_SENSITIVE 标识符大小写敏感。
当大小写敏感时,小写的标识符应用双引号""括起,否则系统自动转换为大写;
当大小写不敏感时,系统不会转换标识符的大小写,在标识符比较时也不能区分大小写。
dminit初始化参数取值:Y、y、1表示敏感;N、n、0表示不敏感。默认值为Y,且数据库初始化之后不可更改,即使修改dm.ini GLOBAL_STR_CASE_SENSITIVE=0,重启数据库参数也无法修改。
在一台及其上建两个两个实例方便测试,除了默认参数外再加一个实例SCM01大小写敏感 CASE_SENSITIVE=0 即 CASE_SENSITIVE=N BLANK_PAD_MODE=1 CHARSET=1
dminit path=/dm8/dmdata DB_NAME=DM_SCM instance_name=SCM01 EXTENT_SIZE=32 PAGE_SIZE=32 LOG_SIZE=500 CASE_SENSITIVE=N BLANK_PAD_MODE=1 CHARSET=1 PORT_NUM=5238 SYSDBA_PWD=dm_OPS_123 SYSAUDITOR_PWD=DmAudit_2025
-- root
/dm8/dmdbms/script/root/dm_service_installer.sh -t dmserver -p SCM01 -dm_ini /dm8/dmdata/DM_SCM/dm.ini
systemctl start DmServiceSCM01
systemctl status DmServiceSCM01
systemctl enable DmServiceSCM01
para_name para_value DEFAULT_VALUE SESS_VALUE FILE_VALUE para_type PARA_MODULE DESCRIPTION
------------------------- ---------- ------------- ---------- ---------- --------- ----------- -------------------------
GLOBAL_STR_CASE_SENSITIVE 0 1 0 1 READ ONLY mem only global_str_case_sensitive
-- 表名/列名:不加双引号自动转大写;加双引号保持原样
CREATE TABLE "table1" (id INT); -- 对象名 = table1(小写)
CREATE TABLE table2 (id INT); -- 对象名 = TABLE2(大写)
-- 数据内容:区分大小写
SELECT * FROM dual WHERE dummy='A'; -- 结果 ≠ WHERE dummy='a'
对象名是否大小写敏感 取决于是否加双引号。
-- 对象名:加不加双引号都不区分大小写
CREATE TABLE "table1" (id INT); -- 与 TABLE1、Table1 视为同一表
-- 数据内容:不区分大小写
SELECT * FROM dual WHERE dummy='A'; -- 与 dummy='a' 返回相同结果
CREATE TABLE test_case_sensitive(c1 VARCHAR(100));
INSERT INTO test_case_sensitive VALUES('a');
INSERT INTO test_case_sensitive VALUES('A');
COMMIT;
-- “A”和“a”是不同对象和字符。
SELECT COUNT(*) FROM test_case_sensitive WHERE c1='a'; -- 1
SELECT COUNT(*) FROM test_case_sensitive WHERE c1='A'; -- 1
-- 即使修改dm.ini GLOBAL_STR_CASE_SENSITIVE=0,重启数据库参数无法修改,再建一个示例 SCM01,设置 GLOBAL_STR_CASE_SENSITIVE = 0
PARA_NAME PARA_VALUE DEFAULT_VALUE SESS_VALUE FILE_VALUE PARA_TYPE PARA_MODULE DESCRIPTION
------------------------- ---------- ------------- ---------- ---------- --------- ----------- -------------------------
GLOBAL_STR_CASE_SENSITIVE 1 1 1 0 READ ONLY mem only global_str_case_sensitive
CREATE TABLE test_case_sensitive(c1 VARCHAR(100));
INSERT INTO test_case_sensitive VALUES('a');
INSERT INTO test_case_sensitive VALUES('A');
COMMIT;
-- “A”和“a”是相同的对象和字符。
SELECT COUNT(*) FROM test_case_sensitive WHERE c1='a'; -- 2
SELECT COUNT(*) FROM test_case_sensitive WHERE c1='A'; -- 2
sysdba@DM_SCM:5238 SQL> select * from test_case_sensitive;
c1
--
a
A
结论:大小写敏感设置建库后无法修改,应在建库前确定。
作用:字符串比较时是否忽略结尾空格
该参数主要的目的是为兼容Oracle。在Oracle中,'a'和'a ’(注意此处多一个空格)是不同的字符,与大小写敏感参数相同,
| 参数值 | 行尾空格处理 | 与 Oracle 兼容性 |
|---|---|---|
| 0(默认) | 比较时忽略右侧空格 | 不兼容 Oracle |
| 1 | 比较时保留右侧空格 | 兼容 Oracle |
-- 比较时忽略右侧空格,'a' = 'a ' = 'a '
SELECT 1 WHERE 'a' = 'a '; -- 结果为真
-- 比较时保留右侧空格,'a' ≠ 'a ' ≠ 'a '
SELECT 1 WHERE 'a' = 'a ';
-- ⭐结果应该为假,但是还是有输出,说明该参数主要影响的还是判断逻辑不同导致结果集返回不同,以及一致性约束的影响,看下面测试。
-- 建表并插入数据
CREATE TABLE tb_test(c1 INT, c2 VARCHAR(20));
-- 第1条数据:a
INSERT INTO tb_test(c1,c2) VALUES(1,'a');
-- 第2条数据:a + 1个空格
INSERT INTO tb_test(c1,c2) VALUES(2,'a ');
-- 第3条数据:a + 2个空格
INSERT INTO tb_test(c1,c2) VALUES(3,'a ');
COMMIT;
BLANK_PAD_MODE=0,三条记录都视为 'a',创建主键失败。
------ 主键创建测试
-- BLANK_PAD_MODE=0
PARA_NAME PARA_VALUE DEFAULT_VALUE SESS_VALUE FILE_VALUE PARA_TYPE PARA_MODULE DESCRIPTION
-------------- ---------- ------------- ---------- ---------- --------- ----------- --------------
BLANK_PAD_MODE 0 0 0 0 READ ONLY mem only blank_pad_mode
-- 查询数据
SELECT c1, c2, LENGTH(c2) FROM tb_test WHERE c2='a'; -- BLANK_PAD_MODE=0 忽略了空格都当成了一个字符
C1 C2 LENGTH(C2)
----------- --- -----------
1 a 1
2 a 2
3 a 3
SELECT c1, c2, LENGTH(c2) FROM tb_test;
C1 C2 LENGTH(C2)
----------- --- -----------
1 a 1
2 a 2
3 a 3
00:12:38 dmdba@CRM:5236 SQL> select * from tb_test;
C1 C2
----------- ---
1 a
2 a
3 a
ALTER TABLE tb_test ADD PRIMARY KEY(c2); -- 报错:[-6612]:违反唯一性约束.
BLANK_PAD_MODE=1,三条记录各不相同,主键创建成功。
-- BLANK_PAD_MODE=1
para_name para_value DEFAULT_VALUE SESS_VALUE FILE_VALUE para_type PARA_MODULE DESCRIPTION
-------------- ---------- ------------- ---------- ---------- --------- ----------- --------------
BLANK_PAD_MODE 1 0 1 0 READ ONLY mem only blank_pad_mode
SELECT c1, c2, LENGTH(c2) FROM tb_test WHERE c2='a'; -- BLANK_PAD_MODE=1,兼容Oracle,'a'和'a ’(注意此处多一个空格)是不同的字符
c1 c2 LENGTH(c2)
----------- -- -----------
1 a 1
SELECT c1, c2, LENGTH(c2) FROM tb_test;
c1 c2 LENGTH(c2)
----------- --- -----------
1 a 1
2 a 2
3 a 3
select * from tb_test;
c1 c2
----------- ---
1 a
2 a
3 a
ALTER TABLE tb_test ADD PRIMARY KEY(c2); -- 成功
结论:结论:当BLANK_PAD_MODE=0时,行尾空格被保留,导致唯一性约束冲突;当BLANK_PAD_MODE=1时,行尾空格被忽略,可以成功创建主键。
常用的逻辑操作符有AND、OR和NOT,他们的运算结果有三个值,分别为TRUE、FALSE和NULL,
其中NULL代表未知。运算优先级顺序为:NOT>AND>OR。
达梦与 Oracle 一致:
NOT > AND > OR
示例验证(关键对比):
SELECT 1 FROM dual WHERE 1=1 OR 1=1 AND 1=2;
-- 实际执行等效于:1=1 OR (1=1 AND 1=2)
与以下结果矛盾,可证明 AND 优先于 OR:
SELECT 1 FROM dual WHERE (1=1 OR 1=1) AND 1=2; -- 无结果
结论:AND 具有更高优先级。
达梦遵循通用 SQL 执行顺序:
HAVING 在分组后过滤,适用于聚合结果的条件判断。
达梦数据库在建库阶段存在多个关键且不可修改的参数,包括大小写敏感、字符集、空格处理模式等。它们会直接影响对象名解析、字符串比较、存储占用甚至约束判断逻辑,因此在设计与迁移时必须慎重选择。
社区地址
更多达梦技术分享:
https://eco.dameng.com
文章
阅读量
获赞
