達夢數據庫大小寫這個參數敏感怎樣設置

1.1      現象描述

達夢在安裝完軟件後,需要初始化數據庫實例(其他大部分數據庫,也是同樣的操作)。

但是,達夢在初始化數據庫實例前,有幾個需要特別注意的參數,這幾個參數一定要特別關注,因爲如果設置錯了,是不能更改的(這些參數,在實例生命週期內,無法更改——如果要更改,除非重新初始化)

這其中一個參數,就是【大小寫敏感】

1.2      處理方法

1.2.1   什麼是大小寫敏感?

大小寫敏感,也就是字面意思,表示數據庫對於字符串的比較,是否區分大小寫(即爲是否敏感)。

這個“是否區分”,是三個方面的:

1.        對象名(表名、存儲過程、序列等其他對象)或者字段名(也就是列名)

2.        字段內容

3.        其他字符串內容(比如用戶輸入的字符串類型的條件值,如where  col ='xxxxxx' ,字符串類型的條件值,說的就是這個'xxxxxx' )

也就是說,如果設置爲敏感,上面三項內容,都不區分大小寫,也就是Abc 就是ABC ,跟進一步來說,也就是在進行字符串比較時(不管這個字符串是對象名、字段名還是字段內容),如果他們之間,不考慮大小寫,是完全一樣的,數據庫則判定他們相等(他們是一樣的)。

1.2.2   如何設置這個參數?

如何設置,分爲兩種情況,第一種情況是,通過圖形化界面安裝,即通過圖形化界面工具初始化數據庫實例的時候(dbca 工具初始化實例);第二種情況是,通過交互式無圖形化界面安裝,即通過命令行工具初始化數據庫實例的時候(dminit 工具初始化實例)。

1. 圖形化dbca 工具初始化實例,在下面這個步驟:

上圖說明了:

1. 在初始化過程中,哪個界面可以設置“字符串比較大小寫敏感”

2. 且通過圖示可以看出(默認情況下),“字符串比較大小寫敏感”的 默認值爲“勾選”(即爲1 ),標識對於大小寫是敏感的,即區分大小寫(對於大小寫不一樣的同內容字符串,判定爲 不一樣)。

2. 命令行dminit 工具初始化實例,通過下面這個參數指定:

上圖說明了:

         1. 這個參數通過 case_sensitive 進行設置

         2. 改參數默認值爲Y (即爲1 ),也就是敏感(區分大小寫)

         3. 如果要設置爲不敏感,通過紅色標識字示例的那樣,在dminit 時,添加參數設置【case_sensitive=n 】或者【case_sensitive=0 】即可(參數名字大寫或者小寫都可以)。

1.2.3   我們從不同的數據庫遷移到達夢時,如何選擇這個參數的設置值?

兩條基本原則:

1. 我們通過前面,已經知道這個參數是幹嘛的了,那麼第一條原則就是按需選擇:【按需設置】

2. 第二條原則是,我們不懂這個參數什麼含義,或者說我們知道這個參數什麼含義,但是還是不知道針對源庫如何設置,那麼就用這個建議:【原先使用Oracle 的,遷移到達夢時,選擇敏感(即爲默認值);原先使用Sqlerver 、Mysql 的,遷移到達夢時,選擇不敏感( 注意:不是默認值哦)】,當然,如果是其他數據庫的類型的話,還是得自己根據實際含義和業務需求判斷,到底把這個參數設置成0 還是1 。

1.2.4   一般情況下,我們如何考慮大小寫敏感的問題?大小寫敏感的一個常見問題?

1.2.4.1 概述

大小寫敏感的問題,我們知道一共涉及到兩類:第一類是字段內容的比較區分(變量或者等號右邊的值,也歸入這類吧),第二類是對象名的比較區分。

我們在使用數據庫的過程中,最常碰到的是第二類。

1.2.4.2 兩個注意事項

在一般的情況下,字段內容是應用自行管理的,應用自己也好控制,但是對於字段名,作爲開發,可能非常頭疼。這裏有兩個基本知識,我們一定需要知道,對於數據庫來說,是希望對開發友好的,所以達夢數據庫的策略和Oracle 的策略一樣:

即:

1.        在建立對象的時候,隨便寫大寫還是小寫,數據庫都處理成大寫

2.        在查詢的時候,對象名,不論寫成大寫還是小寫,數據庫都看成大寫,在數據庫中進行查詢

通過上述兩個處理方式,作爲開發,我們就可以“隨便寫大寫還是小寫”了。

備註:有時候,規範的應用代碼裏,寫的全是駝峯命令法,我們往往也會用這個“自動轉換”的方式,就是雖然怎麼寫對象名,都不會錯——避免駝峯的時候,駝錯一個字母,都找不到對象了(報錯無效的列名、無效的表名或者無效的對象名等,各種無效的XX ——數據庫中找不到))。

在“一”的場景下,往往不能滿足特殊用戶,或者一些“我就是要用小寫,你不能給我設置成大寫的場景”。於是,數據庫必須提供過一種方式,可以用來規避上述這種轉換(我們把“一”中的那種處理,描述成一種自動轉換)。

這個規避方式就是:爲對象名(字段名、表名、存儲過程等等)加上雙引號。

備註:所以有一點是明確的,如果我們 要想用“一”中的 自動轉換,不考慮大小寫,就 一定不要給字段或者對象名 加上雙引號

1.2.4.3 舉三個例子:

Create table test1(v1 int); 和 select v1 from test1;

在數據庫中處理的是:

CREATE TABLE TEST1(V1 INT); 和 SELECT V1 FROM TEST1;

-- 查詢語句是正確的,不會報錯

create table test1(v1 int); 和 select "v1" from test1;

在數據庫中處理的是:

CREATE TABLE TEST1(V1 INT); 和 SELECT v1 FROM TEST1;

-- 查詢語句會報錯:無效的列名v1 ,因爲這裏的列名是 V1 。

create table test1("v1" int); 和 select v1 from test1;

在數據庫中處理的是:

CREATE TABLE TEST1(v1 INT); 和 SELECT V1 FROM TEST1;

-- 查詢語句會報錯:無效的列名V1 ,因爲這裏的列名是 v1 。

當然,下面的這些,查詢語句也都是正確的,不會報錯:

Create table test1( V1 int); 和 select v1 from test1;

在數據庫中處理的是:

CREATE TABLE TEST1(V1 INT); 和 SELECT V1 FROM TEST1;

-- 查詢語句是正確的,不會報錯

Create table test1(v1 int); 和 select V1 from test1;

在數據庫中處理的是:

CREATE TABLE TEST1(V1 INT); 和 SELECT V1 FROM TEST1;

-- 查詢語句是正確的,不會報錯

1.2.4.4 總結:

總的來說,對於字段或者對象名的問題,①要麼全部(建立或者查詢時), 都不加雙引號(建議這種方式,這個也不要建立和查詢時,名字大小寫完全對應),②要麼,全部都加雙引號,且必須保證建立和查詢時,雙引號裏面的內容,完全一致。

當然,有時候我們就是都加了雙引號,或者部分加了,部分沒加,大小寫對不上怎麼辦?

——不要忘了,我們還有“大小寫是否敏感”這個設置。設置成不敏感,這個“對不上”,就是對的上了。只是要注意,這個還會影響字段內容的判斷。

1.2.4.5 備註:什麼叫做影響字段內容的判斷?

Create table test1(v1 varchar(200));

insert into test1 values('a');

insert into test1 values('A');

insert into test1 values('b');

select * from test1 where v1='A';

-- 在敏感的庫裏,只能查出一條數據

-- 在不敏感的庫裏,能查出兩條數據

select * from test1 where v1='a';

-- 在敏感的庫裏,只能查出一條數據

-- 在不敏感的庫裏,能查出兩條數據

select * from test1 where 'A'='a';

-- 在敏感的庫裏,不能查出來任何數據

-- 在不敏感的庫裏,能查出整個表中全部的數據

參考:

https://blog.csdn.net/fengxiaozhenjay/article/details/101457237

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章