国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Oracle/MySQL/PG/SQL Server關(guān)系數(shù)據(jù)庫中NULL與空字符串的區(qū)別

這篇具有很好參考價值的文章主要介紹了Oracle/MySQL/PG/SQL Server關(guān)系數(shù)據(jù)庫中NULL與空字符串的區(qū)別。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Oracle數(shù)據(jù)庫

在Oracle數(shù)據(jù)庫中,''(空字符串)與null是什么關(guān)系呢? ''(空字符串)是否會等同(或者說等價于)于null值呢?''跟' '(長度為零的空字符串或包含一個或多個空格的空字符串)是否又等價?下面我們測試一下

SQL>?create?table?test(id?number?not?null,?name?varchar2(16));

Table?created.

SQL>?insert?into?test(id,?name)?values(1,?null);

1?row?created.

SQL>?insert?into?test(id,?name)?values(2,?'');

1?row?created.

SQL>?insert?into?test(id,?name)?values(3,?'?');?--符號中'?'有一個空格

1?row?created.

SQL>?insert?into?test(id,?name)?values(4,?'??');?--符號中'??'有兩個空格


1?row?created.

SQL>?commit;

Commit?complete.

SQL>?select?*?from?test?where?name?is?null;

????????ID?NAME
----------?----------------
?????????1
?????????2

2?rows?selected.

##三值邏輯,因為''等價與null,null跟任何非null的值比較都等于false
SQL>?select?*?from?test?where?name='';

no?rows?selected

SQL>?select?*?from?test?where?name='?';?--符號中'?'有一個空格

????????ID?NAME
----------?----------------
?????????3

1?row?selected.

SQL>?select?*?from?test?where?name='??';--符號中'??'有兩個空格

????????ID?NAME
----------?----------------
?????????4

1?row?selected.

SQL>?select?id?,dump(name)?from?test;

????????ID?DUMP(NAME)
----------?--------------------
?????????1?NULL
?????????2?NULL
?????????3?Typ=1?Len=1:?32
?????????4?Typ=1?Len=2:?32,32

4?rows?selected.

SQL>

如上所示,插入''時,Oracle數(shù)據(jù)庫確實將其等同與null,但是,像' '這種長度不為零的空字符串,Oracle會存儲其值,從上面實驗就可以看出。另外官方文檔[1]中關(guān)于''與Null的解釋如下:

Oracle Database currently treats a character value with a length of zero as null. However, this may not continue to be true in future releases, and Oracle recommends that you do not treat empty strings the same as nulls.

翻譯如下:

Oracle 數(shù)據(jù)庫當前將長度為零的空字符值視為Null。但是,在將來的版本中,這種情況可能不會繼續(xù)存在,Oracle 建議您不要將空字符串視為null值。

另外,還有一個有意思的現(xiàn)象,如果在查詢條件中,包含一個空格與包含兩個空格的對比,它們似乎又是等價的。如下所示:

SQL>?select?*?from?test?where?'?'?=?'??';?

????????ID?NAME
----------?----------------
?????????1
?????????2
?????????3
?????????4

4?rows?selected.

SQL>

SQL Server數(shù)據(jù)庫

這個實驗,我們在SQL Server數(shù)據(jù)庫測試一下看看,你會看到不一樣的現(xiàn)象。

create?table?test(id?int?,name?varchar(16)?);

insert?into?test(id,?name)?values(1,?null);
insert?into?test(id,?name)?values(2,?'');
insert?into?test(id,?name)?values(3,?'?');--包含一個空格
insert?into?test(id,?name)?values(4,?'??');--包含兩個空格
SELECT?*?FROM?TEST?WHERE?NAME?IS?NULL;
Oracle/MySQL/PG/SQL Server關(guān)系數(shù)據(jù)庫中NULL與空字符串的區(qū)別
SELECT?*?FROM?TEST?WHERE?NAME?='';
SELECT?*?FROM?TEST?WHERE?NAME?='?';--包含一個空格
SELECT?*?FROM?TEST?WHERE?NAME?='??';--包含兩個空格
Oracle/MySQL/PG/SQL Server關(guān)系數(shù)據(jù)庫中NULL與空字符串的區(qū)別
SELECT?ID,?DATALENGTH(NAME)?AS?COLUMN_LEN?FROM?TEST;
Oracle/MySQL/PG/SQL Server關(guān)系數(shù)據(jù)庫中NULL與空字符串的區(qū)別
SELECT?*?FROM?TEST?WHERE?''?=?'?';
Oracle/MySQL/PG/SQL Server關(guān)系數(shù)據(jù)庫中NULL與空字符串的區(qū)別

如上測試,SQL Server跟Oracle不一樣,在SQL Server中,’’跟null是不一樣的,空字符串是空字符串,null是null,SQL Server數(shù)據(jù)庫中不會將長度為零的空字符串視為null。但是SQL Server在查詢的時候比較空字符串時,長度為零的空字符串與長度為1的字符串,長度為N的字符串,它們似乎是等價的。跟Oracle的行為完全不一樣。這個的解釋如下,詳情參考官方文檔[2]

SQL Server follows the ANSI/ISO SQL-92 specification (Section 8.2, , General rules #3) on how to compare strings with spaces. The ANSI standard requires padding for the character strings used in comparisons so that their lengths match before comparing them. The padding directly affects the semantics of WHERE and HAVING clause predicates and other Transact-SQL string comparisons. For example, Transact-SQL considers the strings 'abc' and 'abc ' to be equivalent for most comparison operations.

The only exception to this rule is the LIKE predicate. When the right side of a LIKE predicate expression features a value with a trailing space, SQL Server does not pad the two values to the same length before the comparison occurs. Because the purpose of the LIKE predicate, by definition, is to facilitate pattern searches rather than simple string equality tests, this does not violate the section of the ANSI SQL-92 specification mentioned earlier.

SQL Server 遵循 ANSI/ISO SQL-92 規(guī)范(第8.2、<比較謂語>、常規(guī)規(guī)則 #3),說明如何比較帶有空格的字符串。 ANSI 標準要求在比較中使用空字符填充字符串,以便它們的長度與比較它們的長度相匹配。 填充直接影響 WHERE 和 HAVING 子句謂詞以及其他 Transact-SQL 字符串比較的語義。 例如,Transact-SQL 會將字符串 "abc" 和 "abc " 視為對大多數(shù)比較操作等效。此規(guī)則的唯一例外是類似謂語。 當 LIKE 謂詞表達式的右側(cè)具有尾隨空格的值時,SQL Server 不會在比較發(fā)生之前將這兩個值填充到同一長度。 根據(jù)定義,LIKE 謂語的用途是促進模式搜索,而不是簡單的字符串相等測試,這不違反前面提到的 ANSI SQL-92 規(guī)范的部分。

MySQL數(shù)據(jù)庫

接下來,我們來看看MySQL數(shù)據(jù)庫的測試情況。

mysql>?use?test
Database?changed
mysql>?create?table?test(id?int?not?null,?name?varchar(16));
Query?OK,?0?rows?affected?(0.01?sec)

mysql>?insert?into?test(id?,?name)?values(1,?null);
Query?OK,?1?row?affected?(0.01?sec)

mysql>?insert?into?test(id?,?name)?values(2,?'');
Query?OK,?1?row?affected?(0.01?sec)

mysql>?insert?into?test(id?,?name)?values(3,?'?');
Query?OK,?1?row?affected?(0.00?sec)

mysql>?insert?into?test(id?,?name)?values(4,?'??');
Query?OK,?1?row?affected?(0.00?sec)

mysql>?select?*?from?test?where?name?is?null;
+----+------+
|?id?|?name?|
+----+------+
|??1?|?NULL?|
+----+------+
1?row?in?set?(0.00?sec)

mysql>?select?*?from?test?where?name='';
+----+------+
|?id?|?name?|
+----+------+
|??2?|??????|
|??3?|??????|
|??4?|??????|
+----+------+
3?rows?in?set?(0.00?sec)

mysql>
mysql>?select?*?from?test?where?name='?';
+----+------+
|?id?|?name?|
+----+------+
|??2?|??????|
|??3?|??????|
|??4?|??????|
+----+------+
3?rows?in?set?(0.00?sec)

mysql>

MySQL的對于null和空字符串的處理方式跟SQL Server是一致的。但是你會發(fā)現(xiàn)還是有不一樣的地方,下面這個SQL語句, 在SQL Server和MySQL中有不一樣的結(jié)果。

mysql>?select?*?from?test?where?''?=?'?';
Empty?set?(0.00?sec)

PostgreSQL數(shù)據(jù)庫

postgres=#?\c?kerry
You?are?now?connected?to?database?"kerry"?as?user?"postgres".
kerry=#?create?table?test(id?int?not?null,?name?varchar(16));
CREATE?TABLE
kerry=#?insert?into?test(id?,?name)?values(1,?null);
INSERT?0?1
kerry=#?insert?into?test(id,??name)?values(2,?'');
INSERT?0?1
kerry=#?insert?into?test(id,??name)?values(3,?'?');
INSERT?0?1
kerry=#?insert?into?test(id,??name)?values(4,?'??');
INSERT?0?1
kerry=#?select?*?from?test?where?name?is?null;
?id?|?name?
----+------
??1?|?
(1?row)

kerry=#?select?*?from?test?where?name='';
?id?|?name?
----+------
??2?|?
(1?row)

kerry=#?select?*?from?test?where?name='?';
?id?|?name?
----+------
??3?|??
(1?row)

kerry=#?select?*?from?test?where?name='??';
?id?|?name?
----+------
??4?|???
(1?row)

kerry=#

kerry=#?select?*?from?test?where?''?=?'?';
?id?|?name?
----+------
(0?rows)
Oracle/MySQL/PG/SQL Server關(guān)系數(shù)據(jù)庫中NULL與空字符串的區(qū)別

PostgreSQL的對于null和空字符串的處理方式跟MySQL是一致的.

總結(jié):

幾大關(guān)系數(shù)據(jù)庫中,只有Oracle數(shù)據(jù)庫會將''視為null,其它關(guān)系數(shù)據(jù)庫中,null和''是不同的。另外,包含一個或多個空格的空字符串在細節(jié)上有所不同,上面簡單實驗已經(jīng)展示了這些細微區(qū)別。

參考資料

[1]

1: https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Nulls.html#:~:text=Oracle%20Database%20currently%20treats%20a%20character%20value%20with,expression%20containing%20a%20null%20always%20evaluates%20to%20null

[2]

2: https://support.microsoft.com/en-us/topic/inf-how-sql-server-compares-strings-with-trailing-spaces-b62b1a2d-27d3-4260-216d-a605719003b0文章來源地址http://www.zghlxwxcb.cn/news/detail-573472.html

到了這里,關(guān)于Oracle/MySQL/PG/SQL Server關(guān)系數(shù)據(jù)庫中NULL與空字符串的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • SQL Server、MySQL和Oracle數(shù)據(jù)庫分頁查詢的區(qū)別與聯(lián)系

    SQL Server、MySQL和Oracle數(shù)據(jù)庫分頁查詢的區(qū)別與聯(lián)系

    摘要:本文將通過一個現(xiàn)實例子,詳細解釋SQL Server、MySQL和Oracle這三種常見關(guān)系型數(shù)據(jù)庫在分頁查詢方面的區(qū)別與聯(lián)系。我們將提供具體場景下的SQL語句示例,并解釋每個數(shù)據(jù)庫的分頁查詢用法以及優(yōu)化方法,幫助讀者更好地選擇適合自己需求的分頁查詢方式。 假設(shè)我們有一

    2024年02月11日
    瀏覽(65)
  • 實例講解C++連接各種數(shù)據(jù)庫,包含SQL Server、MySQL、Oracle、ACCESS、SQLite 和 PostgreSQL、MongoDB 數(shù)據(jù)庫

    ? C++ 是一種通用的編程語言,可以使用不同的庫和驅(qū)動程序來連接各種數(shù)據(jù)庫。以下是一些示例代碼,演示如何使用 C++ 連接 SQL Server、MySQL、Oracle、ACCESS、SQLite 和 PostgreSQL、MongoDB 數(shù)據(jù)庫。 連接 SQL Server 數(shù)據(jù)庫 要使用 C++ 連接 SQL Server 數(shù)據(jù)庫,可以使用 Microsoft 的 ADODB 庫。以

    2024年02月05日
    瀏覽(35)
  • Sql server 連接 Oracle數(shù)據(jù)庫

    Sql server 連接 Oracle數(shù)據(jù)庫

    前提預警:本機必須裝有Oracle客戶端 檢查是否安裝Oracle客戶端,并檢查TNS信息是否配置完成 1.1、 在cmd中執(zhí)行 sqlplus ,沒有報錯并出現(xiàn)Oracle版本號,則表示Oracle已安裝 1.2、配置TNS信息(最上面的10.0.0.130可隨意定義,eg:test、orcl、qerghasd…) 配置ODBC數(shù)據(jù)信息 2.1、打開ODBC數(shù)據(jù)

    2024年02月03日
    瀏覽(20)
  • Sql server和Oracle默認數(shù)據(jù)庫

    ????????SQL Server 和 Oracle 都有自帶的一些默認數(shù)據(jù)庫,保存了不同的系統(tǒng)信息和配置數(shù)據(jù)。 ????????SQL Server 上的默認數(shù)據(jù)庫: ???????? master :SQL Server 引擎的系統(tǒng)級目錄,存儲了 所有系統(tǒng)層級的信息和元數(shù)據(jù) ,例如登錄賬號信息。 ????????tempdb:存儲各種系

    2024年02月09日
    瀏覽(33)
  • 【數(shù)據(jù)庫·關(guān)系數(shù)據(jù)庫標準語言SQL·學習筆記】Microsoft SQL Server數(shù)據(jù)庫的建立和刪除

    【數(shù)據(jù)庫·關(guān)系數(shù)據(jù)庫標準語言SQL·學習筆記】Microsoft SQL Server數(shù)據(jù)庫的建立和刪除

    開發(fā)環(huán)境:SQL Server Management Studio(SSMS) 利用數(shù)據(jù)庫對象資源管理器創(chuàng)建數(shù)據(jù)庫 (1)右擊對象資源管理器中的數(shù)據(jù)庫,選擇新建數(shù)據(jù)庫 (2)在新建數(shù)據(jù)庫界面輸入數(shù)據(jù)庫名稱 ,并選擇確定 利用CREAT DATABASE命令在SSM工具的新建查詢中創(chuàng)建數(shù)據(jù)庫 1.語法格式 CREATE DATABASE dat

    2024年02月08日
    瀏覽(34)
  • SQL SERVER連接oracle數(shù)據(jù)庫幾種方法

    --1 方式? --查詢oracle數(shù)據(jù)庫中的表? 舉一反三:在查詢分析器中輸入: --在sqlserver中創(chuàng)建與oracle數(shù)據(jù)庫中的表同名的表? --2、方式? --在master數(shù)據(jù)庫中查看已經(jīng)存在的鏈接服務器? --要在企業(yè)管理器內(nèi)指定登錄帳號 --備注:引用ORACLE服務器上的表時,用戶名稱與表名一定要大寫

    2024年02月02日
    瀏覽(22)
  • SQL Server數(shù)據(jù)庫如何添加Oracle鏈接服務器(Windows系統(tǒng))

    SQL Server數(shù)據(jù)庫如何添加Oracle鏈接服務器(Windows系統(tǒng))

    官方下載地址:https://www.oracle.com/technetwork/topics/dotnet/downloads/odacdeploy-4242173.html 1.2.1 下載的壓縮包解壓位置 ??比如我直接放到D盤根目錄 1.2.2 接著用管理員運行Cmd 此處一定要用管理員運行,否則會報錯 使用管理員打開終端,運行如下命令: 在系統(tǒng)環(huán)境變量中,為Path添加“

    2024年02月14日
    瀏覽(106)
  • 【MySQL】——關(guān)系數(shù)據(jù)庫標準語言SQL(大綱)

    【MySQL】——關(guān)系數(shù)據(jù)庫標準語言SQL(大綱)

    ??個人專欄: ?? 算法設(shè)計與分析:算法設(shè)計與分析_IT閆的博客-CSDN博客 ??Java基礎(chǔ):Java基礎(chǔ)_IT閆的博客-CSDN博客 ??c語言:c語言_IT閆的博客-CSDN博客 ??MySQL:數(shù)據(jù)結(jié)構(gòu)_IT閆的博客-CSDN博客 ??數(shù)據(jù)結(jié)構(gòu):??????數(shù)據(jù)結(jié)構(gòu)_IT閆的博客-CSDN博客 ??C++:C++_IT閆的博客-CSDN博

    2024年01月20日
    瀏覽(54)
  • Sqlserver_Oracle_Mysql_Postgresql不同關(guān)系型數(shù)據(jù)庫之主從延遲的理解和實驗

    關(guān)系型數(shù)據(jù)庫主從節(jié)點的延遲是否和隔離級別有關(guān)聯(lián),個人認為兩者沒有直接關(guān)系,主從延遲在關(guān)系型數(shù)據(jù)庫中一般和這兩個時間有關(guān):事務日志從主節(jié)點傳輸?shù)綇墓?jié)點的時間+事務日志在從節(jié)點的應用時間 事務日志從主節(jié)點傳輸?shù)綇墓?jié)點的時間,相關(guān)因素有以下2點: 1、事

    2024年02月14日
    瀏覽(24)
  • 【MySQL】:探秘主流關(guān)系型數(shù)據(jù)庫管理系統(tǒng)及SQL語言

    【MySQL】:探秘主流關(guān)系型數(shù)據(jù)庫管理系統(tǒng)及SQL語言

    ?? 嶼小夏 : 個人主頁 ??個人專欄 : MySQL從入門到進階 ?? 莫道桑榆晚,為霞尚滿天! 在現(xiàn)代信息技術(shù)領(lǐng)域中,數(shù)據(jù)庫管理系統(tǒng)扮演著至關(guān)重要的角色。本文將介紹數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)和SQL等概念,并深入探討主流的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)以及關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)模

    2024年01月20日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包