DM8 字串大小寫敏感

LEVEL7發表於2021-06-09

1.     大小寫敏感引數是什麼?

大小寫敏感引數是達夢資料庫初始化時的一個全域性引數,預設是敏感的,並且設定後不可更改。

dminit help

initdb V8

db version: 0x7000c

License will expire on 2022-03-25

格式: ./dminit     KEYWORD=value

 

例程: ./dminit     PATH=/public/dmdb/dmData PAGE_SIZE=16

 

關鍵字                     說明(預設值)

--------------------------------------------------------------------------------

INI_FILE                    初始化檔案dm.ini存放的路徑

PATH                        初始資料庫存放的路徑

CTL_PATH                    控制檔案路徑

LOG_PATH                    日誌檔案路徑

EXTENT_SIZE                 資料檔案使用的簇大小(16),可選值:16, 32, 64,單位:頁

PAGE_SIZE                   資料頁大小(8),可選值:4, 8, 16, 32,單位:K

LOG_SIZE                    日誌檔案大小(256),單位為:M,範圍為:64M ~ 2G

CASE_SENSITIVE              大小敏感(Y),可選值:Y/N,1/0

CHARSET/UNICODE_FLAG        字符集(0),可選值:0[GB18030],1[UTF-8],2[EUC-KR]

SEC_PRIV_MODE               許可權管理模式(0),可選值:0[TRADITION],1[BMJ],2[EVAL]

LENGTH_IN_CHAR             VARCHAR 型別長度是否以字元為單位(N),可選值:Y/N,1/0

SYSDBA_PWD                  設定SYSDBA密碼(SYSDBA)

SYSAUDITOR_PWD              設定SYSAUDITOR密碼(SYSAUDITOR)

DB_NAME                     資料庫名(DAMENG)

INSTANCE_NAME               例項名(DMSERVER)

PORT_NUM                    監聽埠號(5236)

BUFFER                      系統快取大小(100),單位M

TIME_ZONE                   設定時區(+08:00)

PAGE_CHECK                  頁檢查模式(0),可選值:0/1/2

EXTERNAL_CIPHER_NAME        設定預設加密演算法

EXTERNAL_HASH_NAME          設定預設HASH演算法

EXTERNAL_CRYPTO_NAME        設定根金鑰加密引擎

RLOG_ENC_FLAG               設定日誌檔案是否加密(N),可選值:Y/N,1/0

USBKEY_PIN                  設定USBKEY PIN

PAGE_ENC_SLICE_SIZE         設定頁加密分片大小,可選值:0、512、4096,單位:Byte

ENCRYPT_NAME                設定全庫加密演算法

BLANK_PAD_MODE              設定空格填充模式(0),可選值:0/1

SYSTEM_MIRROR_PATH         SYSTEM 資料檔案映象路徑

MAIN_MIRROR_PATH           MAIN 資料檔案映象

ROLL_MIRROR_PATH            回滾檔案映象路徑

MAL_FLAG                    初始化時設定dm.ini中的MAL_INI(0)

ARCH_FLAG                   初始化時設定dm.ini中的ARCH_INI(0)

MPP_FLAG                   Mpp 系統內的庫初始化時設定dm.ini中的mpp_ini(0)

CONTROL                     初始化配置檔案(配置檔案格式見系統管理員手冊)

AUTO_OVERWRITE              是否覆蓋所有同名檔案(0) 0:不覆蓋 1:部分覆蓋 2:完全覆蓋

USE_NEW_HASH                是否使用改進的字元型別HASH演算法(1)

ELOG_PATH                   指定初始化過程中生成的日誌檔案所在路徑

AP_PORT_NUM                ECS 模式下AP協同工作的監聽埠

DFS_FLAG                    初始化時設定dm.ini中的DFS_INI(0)

DFS_PATH                    啟用dfs時指定資料檔案的預設路徑

DFS_HOST                    指定連線分散式系統DFS的服務地址(localhost)

DFS_PORT                    指定連線分散式系統DFS的服務埠號(3332)

DFS_COPY_NUM                指定分散式系統的副本數(3)

DFS_DB_NAME                 指定分散式系統的中資料庫名(預設與DB_NAME一致)

SHARE_FLAG                  指定分散式系統中該資料庫的共享屬性(0)

REGION_MODE                 指定分散式系統中該資料庫的系統表空間資料檔案的區塊策略(0) 0:微區策略 1:巨集區策略

HUGE_WITH_DELTA             是否僅支援建立事務型HUGE表(1) 1:是 0:否

RLOG_GEN_FOR_HUGE           是否生成HUGE表REDO日誌(0) 1:是 0:否

PSEG_MGR_FLAG               是否僅使用管理段記錄事務資訊(0) 1:是 0:否

CHAR_FIX_STORAGE           CHAR 是否按定長儲存(N),可選值:Y/N,1/0

HELP                        列印幫助資訊

查詢大小寫敏感設定的情況:

SELECT CASE_SENSITIVE(); -- 結果為 1 是大小寫敏感,結果為 0 是不敏感

2.     大小寫敏感針對的是物件名還是表中資料?

首先看看對錶中內容作比較時大小寫敏感的影響。

CREATE TABLE  TEST_CASE_SENSITIVE(C1 VARCHAR(100));

INSERT INTO TEST_CASE_SENSITIVE VALUES('a');

INSERT INTO TEST_CASE_SENSITIVE VALUES('A');

COMMIT;

-- 大小寫敏感的情況

SELECT COUNT(*) FROM TEST_CASE_SENSITIVE WHERE C1='a'; -- 結果為1

SELECT COUNT(*) FROM TEST_CASE_SENSITIVE WHERE C1='A'; -- 結果為1

-- 大小寫不敏感的情況

SELECT COUNT(*) FROM TEST_CASE_SENSITIVE WHERE C1='a'; -- 結果為2

SELECT COUNT(*) FROM TEST_CASE_SENSITIVE WHERE C1='A'; -- 結果為2

再來看看大小寫敏感引數對物件名的影響。

-- 在大小寫敏感的情況下,建立物件時不要對物件名加雙引號,大小寫對物件名沒有影響

CREATE TABLE a(C1 INT);

SELECT * FROM a;    -- 執行成功

SELECT * FROM A;    -- 執行成功

SELECT * FROM "A";  -- 執行成功

SELECT * FROM "a";  -- 執行失敗:無效的表或檢視名[A]

CREATE TABLE "b"(C1 INT);

SELECT * FROM b;    -- 執行失敗:無效的表或檢視名[B]

SELECT * FROM B;    -- 執行失敗:無效的表或檢視名[B]

SELECT * FROM "b";  -- 執行成功

SELECT * FROM "B";  -- 執行失敗:無效的表或檢視名[B]

-- 注意:在達夢管理工具中使用圖形介面建立物件時如果用小寫就會自動加上雙引號,查詢的時候必須使用雙引號來訪問,很多朋友問題注意出在這裡,如果在大小寫敏感的庫裡面使用圖形介面而不是 SQL 語句來建立物件,一定注意要用大寫,用小寫就會自動加雙引號,強制保持大小寫了

-- 在大小寫不敏感的情況下,加不加雙引號都無所謂,對查詢沒有影響

CREATE TABLE a(C1 INT);

SELECT * FROM a;    -- 執行成功

SELECT * FROM A;    -- 執行成功

SELECT * FROM "a";  -- 執行成功

SELECT * FROM "A";  -- 執行成功

CREATE TABLE "b"(C1 INT);

SELECT * FROM b;    -- 執行成功

SELECT * FROM B;    -- 執行成功

SELECT * FROM "b";  -- 執行成功

SELECT * FROM "B";  -- 執行成功

OTHERS  操作,大小寫敏感引數對列名的影響。

-- 在大小寫敏感的情況下

create table test1(id int,name char(20));

-- 進行 DML 操作

insert into sysdba.test1 values(1,'an');

update sysdba.test1 set id=100 where id=1;

delete from sysdba.test1 where id=100;

commit;

--4  條語句執行成功

insert into sysdba.test1("id","name") values(1,'an');-- 無效的列名[id]

update sysdba.test1 set id=100 where "id"=1;-- 無效的列名[id]

delete from sysdba.test1 where "id"=100;-- 無效的列名[id]

-- 在大小寫不敏感的情況下

create table test1(id int,name char(20));

- 進行 DML 操作

insert into sysdba.test1 values(1,'an');

update sysdba.test1 set id=100 where id=1;

delete from sysdba.test1 where id=100;

commit;

--4  條語句執行成功

insert into sysdba.test1("id","name") values(1,'an');-- 執行成功

update sysdba.test1 set id=100 where ID=1;-- 執行成功

select * from TEST1 where NAME='AN';-- 執行成功

delete from sysdba.test1 where NAME='AN';-- 執行成功

select * from TEST1;-- 執行成功

create table test2("id" int,id int);-- 執行失敗,列[id]已存在

3.     總結

1)     大小寫敏感的資料庫中,建立表時:

Ø    如果不對錶名或列名新增"",那麼表名和列名都自動轉換為大寫形式

Ø    如果對錶名或列名新增"",會固定書寫時的大、小寫形式,書寫時採取的是小寫形式,那麼就定型為小寫形式,其他不新增""的則自動轉換為大寫形式,無論書寫時採取的是大寫形式或小寫形式

Ø    同名的資料庫物件,如果大小寫不同,那麼則為兩個不同的物件,欄位同樣如此

Ø    一個表中,即使是相同的欄位名,只要大小寫不同,允許存在同名且不同大小寫形式的欄位

2)     大小寫敏感的資料庫中,DML 或 DDL 操作時:

Ø    如果不對錶名或列名新增"",那麼表名和列名都自動轉換為大寫形式

Ø    對錶進行 DML 操作時,如果沒有小寫形式的欄位,不能採取小寫加""的形式指定過濾欄位,會被認定為無效的欄位

Ø    如果對錶名或列名新增"",會固定書寫時的大、小寫形式,""中是大寫形式,則過濾欄位就是大寫欄位,""中是小寫欄位,則過濾欄位就是小寫欄位

Ø    對其進行 DML 操作時,需要利用""指定表名和欄位名,否則預設會認定以大寫形式去查詢物件

Ø    查詢時,''和""界定符中字串區分大小寫,界定符中的字串若是大寫形式,那僅查詢這個大寫形式的物件,若是或小寫形式,那僅查詢這個小寫形式的物件,DML 操作依舊

3)     大小寫不敏感的資料庫中,建立表時:

Ø    無論對不對錶名或列名新增"",表名和列名的大小寫形式不會發生變化,大寫形式就是大寫形式,小寫形式就是小寫形式

Ø    不允許存在同名的資料庫物件,即使大小寫不同,預設也只能存在一個

Ø    一個表中,也不允許相同的欄位名,即使大小寫不同

Ø    查詢時,''和""界定符不區分大小寫,界定符中的查詢或過濾條件即使是大寫或小寫,都可以查詢到預期的結果集

4)     大小寫不敏感的資料庫中,DML 或 DDL 操作時:

Ø    無論對不對錶名或列名新增"",表名和列名的大小寫形式不會發生變化,大寫形式就是大寫形式,小寫形式就是小寫形式

Ø    不允許存在同名的資料庫物件,即使大小寫不同,預設也只能存在一個

Ø    一個表中,也不允許相同的欄位名,即使大小寫不同

Ø    查詢時,''和""界定符不區分大小寫,界定符中的查詢或過濾條件即使是大寫或小寫,都可以查詢到預期的結果集,進行 DML 操作時依舊


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31516603/viewspace-2776124/,如需轉載,請註明出處,否則將追究法律責任。

相關文章