當前位置:首頁 » 服務存儲 » blob存儲數據完整性確認
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

blob存儲數據完整性確認

發布時間: 2023-03-24 05:42:22

㈠ Oracle中Blob和Clob的作用

BLOB是用來存儲大量二進制數據的;CLOB用來存儲大量文本數據。

㈡ mysql數據類型中blob和binary的區別

MySQL 數據類型細分下來,大概有以下幾類:

  • 數值,典型代表為 tinyint,int,bigint

  • 浮點/定點,典型代表為 float,double,decimal 以及相關的同義詞

  • 字元串,典型代表為 char,varchar

  • 時間日期,典型代表為 date,datetime,time,timestamp

  • 二進制,典型代表為 binary,varbinary

  • 位類型

  • 枚舉類型

  • 集合類型

  • 大對象,比如 text,blob

  • json 文檔類型

  • 一、數值類型(不是數據類型,別看錯了)如果用來存放整數,根據范圍的不同,選擇不同的類型。


  • 注意:timestamp 代表的時間戳是一個 int32 存儲的整數,取值范圍為 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999';datetime 取值范圍為 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。

  • 綜上所述,日期這塊類型的選擇遵循以下原則:

  • 1. 如果時間有可能超過時間戳范圍,優先選擇 datetime。2. 如果需要單獨獲取年份值,比如按照年來分區,按照年來檢索等,最好在表中添加一個 year 類型來參與。3. 如果需要單獨獲取日期或者時間,最好是單獨存放,而不是簡單的用 datetime 或者 timestamp。後面檢索時,再加函數過濾,以免後期增加 SQL 編寫帶來額外消耗。

  • 4. 如果有保存毫秒類似的需求,最好是用時間類型自己的特性,不要直接用字元類型來代替。MySQL 內部的類型轉換對資源額外的消耗也是需要考慮的。

    示例 5

  • 建立表 t5,對這些可能需要的欄位全部分離開,這樣以後寫 SQL 語句的時候就很容易了。

  • 當然了,這種情形佔用額外的磁碟空間。如果想在易用性與空間佔用量大這兩點來折中,可以用 MySQL 的虛擬列來實時計算。比如假設 c5 欄位不存在,想要得到 c5 的結果。mysql-(ytt/3305)->alter table t5 drop c5, add c5 year generated always as (year(c1)) virtual;Query OK, 1 row affected (2.46 sec)Records: 1 Duplicates: 0 Warnings: 0



  • 五、二進制類型

  • binary 和 varbinary 對應了 char 和 varchar 的二進制存儲,相關的特性都一樣。不同的有以下幾點:

  • binary(10)/varbinary(10) 代表的不是字元個數,而是位元組數。

  • 行結束符不一樣。char 的行結束符是 ,binary 的行結束符是 0x00。

  • 由於是二進制存儲,所以字元編碼以及排序規則這類就直接無效了。

  • 示例 6

    來看這個 binary 存取的簡單示例,還是之前的變數 @a。

    切記!這里要提前計算好 @a 佔用的位元組數,以防存儲溢出。


  • 六、位類型

  • bit 為 MySQL 里存儲比特位的類型,最大支持 64 比特位, 直接以二進制方式存儲,一般用來存儲狀態類的信息。比如,性別,真假等。具有以下特性:

  • 1. 對於 bit(8) 如果單純存放 1 位,左邊以 0 填充 00000001。2. 查詢時可以直接十進制來過濾數據。3. 如果此欄位加上索引,MySQL 不會自己做類型轉換,只能用二進制來過濾。

  • 示例 7

  • 創建表 c1, 欄位性別定義一個比特位。mysql-(ytt/3305)->create table c1(gender bit(1));Query OK, 0 rows affected (0.02 sec)



  • mysql-(ytt/3305)->select cast(gender as unsigned) 'f1' from c1;+------+| f1 |+------+| 0 || 1 |+------+2 rows in set (0.00 sec)


  • 過濾數據也一樣,二進制或者直接十進制都行。mysql-(ytt/3305)->select conv(gender,16,10) as gender -> from c1 where gender = b'1';+--------+| gender |+--------+| 1|+--------+1 row in set (0.00 sec)mysql-(ytt/3305)->select conv(gender,16,10) as gender -> from c1 where gender = '1';+--------+| gender |+--------+| 1|+--------+1 row in set (0.00 sec)


  • 其實這樣的場景,也可以定義為 char(0),這也是類似於 bit 非常優化的一種用法。

  • mysql-(ytt/3305)->create table c2(gender char(0));Query OK, 0 rows affected (0.03 sec)


  • 那現在我給表 c1 簡單的造點測試數據。

  • mysql-(ytt/3305)->select count(*) from c1;+----------+| count(*) |+----------+| 33554432 |+----------+1 row in set (1.37 sec)


  • 把 c1 的數據全部插入 c2。

  • mysql-(ytt/3305)->insert into c2 select if(gender = 0,'',null) from c1;Query OK, 33554432 rows affected (2 min 18.80 sec)Records: 33554432 Duplicates: 0 Warnings: 0


  • 兩張表的磁碟佔用差不多。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 1.9G4085684 933M -rw-r----- 1 mysql mysql 932M 12月 11 10:16 c1.ibd4082686 917M -rw-r----- 1 mysql mysql 916M 12月 11 10:22 c2.ibd


  • 檢索方式稍微有些不同,不過效率也差不多。所以說,字元類型不愧為萬能類型。


  • 七、枚舉類型

  • 枚舉類型,也即 enum。適合提前規劃好了所有已經知道的值,且未來最好不要加新值的情形。枚舉類型有以下特性:

  • 1. 最大佔用 2 Byte。2. 最大支持 65535 個不同元素。3. MySQL 後台存儲以下標的方式,也就是 tinyint 或者 smallint 的方式,下標從 1 開始。4. 排序時按照下標排序,而不是按照裡面元素的數據類型。所以這點要格外注意。

  • 示例 8

  • 創建表 t7。mysql-(ytt/3305)->create table t7(c1 enum('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.03 sec)



  • 八、集合類型

    集合類型 SET 和枚舉類似,也是得提前知道有多少個元素。SET 有以下特點:

  • 1. 最大佔用 8 Byte,int64。2. 內部以二進制位的方式存儲,對應的下標如果以十進制來看,就分別為 1,2,4,8,...,pow(2,63)。3. 最大支持 64 個不同的元素,重復元素的插入,取出來直接去重。4. 元素之間可以組合插入,比如下標為 1 和 2 的可以一起插入,直接插入 3 即可。

  • 示例 9

    定義表 c7 欄位 c1 為 set 類型,包含了 8 個值,也就是下表最大為 pow(2,7)。

  • mysql-(ytt/3305)->create table c7(c1 set('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'));Query OK, 0 rows affected (0.02 sec)


  • 插入 1 到 128 的所有組合。

  • mysql-(ytt/3305)->INSERT INTO c7WITH RECURSIVE ytt_number (cnt) AS ( SELECT 1 AS cnt UNION ALL SELECT cnt + 1 FROM ytt_number WHERE cnt < pow(2, 7) )SELECT *FROM ytt_number;Query OK, 128 rows affected (0.01 sec)Records: 128 Duplicates: 0 Warnings: 0

  • 九、數據類型在存儲函數中的用法

    函數里除了顯式聲明的變數外,默認 session 變數的數據類型很弱,隨著給定值的不同隨意轉換。

  • 示例 10

  • 定義一個函數,返回兩個給定參數的乘積。定義里有兩個變數,一個是 v_tmp 顯式定義為 int64,另外一個 @vresult 隨著給定值的類型隨意變換類型。


    簡單調用下。

  • mysql-(ytt/3305)->select ytt_sample_data_type(1111,222) 'result';+--------------------------+| result |+--------------------------+| The result is: '246642'. |+--------------------------+1 row in set (0.00 sec)


  • 總結

    本篇把 MySQL 基本的數據類型做了簡單的介紹,並且用了一些容易理解的示例來梳理這些類型。我們在實際場景中,建議選擇適合最合適的類型,不建議所有數據類型簡單的最大化原則。比如能用 varchar(100),不用 varchar(1000)。

㈢ 什麼是blob,mysql blob大小配置介紹

BLOB介紹

BLOB (binary large object),二進制大對象,是一個可以存儲二進制文件的容器。在計算機中,BLOB常常是資料庫中用來存儲二進制文件的欄位類型。BLOB是一
個大文件,典型的BLOB是一張圖片或一個聲音文件,由於它們的尺寸,必須使用特殊的方式來處理(例如:上傳、下載或者存放到一個資料庫)慎派。根據Eric Raymond的
說法,處理BLOB的主要思想就是讓文件處理器(如資料庫管理器)不去理會文件是什麼,而是關心如何去處理它。但也有專家強調,這種處理大數據對談帆象的方法是把雙
刃劍,它有可能引發一些問題,如存儲的二進制文件過大,會使資料庫的性能下降。在資料庫中存放體積較大的多媒體對象就是應用程序處理BLOB的典型例子。
mysql BLOB類型
MySQL中,BLOB是個類型系列,包括:TinyBlob、Blob、寬侍賀MediumBlob、LongBlob,這幾個類型之間的唯一區別是在存儲文件的最大大小上不同。
MySQL的四種BLOB類型
類型 大小(單位:位元組)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G

㈣ 瀏覽器端生成的blob數據怎麼上傳給伺服器端的TP處理

1. 首先嘛,你得在瀏覽器里輸入要網址:

2. 瀏覽器查找域名的IP地址

導航的第一步是通過訪問的域名找出其IP地址。DNS查找過程如下:
瀏覽器緩存 – 瀏覽器會緩存DNS記錄一段時間。 有趣的是,操作系統沒有告訴瀏覽器儲存DNS記錄的時間,這樣不同瀏覽器會儲存個自固定的一個時間(2分鍾到30分鍾不等)。
系統緩存 – 如果在瀏覽器緩存里沒有找到需要的記錄,瀏覽器會做一個系統調用(windows里是gethostbyname)。這樣便可獲得系統緩存中的記錄。
路由器緩存 – 接著,前面的查詢請求發向路由器,它一般會有自己的DNS緩存。
ISP DNS 緩存 – 接下來要check的就是ISP緩存DNS的伺服器。在這一般都能找到相應的緩存記錄。
遞歸搜索 – 你的ISP的DNS伺服器從跟域名伺服器開始進行遞歸搜索,從.com頂級域名伺服器到Facebook的域名伺服器。一般DNS伺服器的緩存中會有.com域名伺服器中的域名,所以到頂級伺服器的匹配過程不是那麼必要了。
DNS遞歸查找如下圖所示:

DNS有一點令人擔憂,這就是像wikipedia.org 或者 facebook.com這樣的整個域名看上去只是對應一個單獨的IP地址。還好,有幾種方法可以消除這個瓶頸:
循環 DNS 是DNS查找時返回多個IP時的解決方案。舉例來說,Facebook.com實際上就對應了四個IP地址。
負載平衡器 是以一個特定IP地址進行偵聽並將網路請求轉發到集群伺服器上的硬體設備。 一些大型的站點一般都會使用這種昂貴的高性能負載平衡器。
地理 DNS 根據用戶所處的地理位置,通過把域名映射到多個不同的IP地址提高可擴展性。這樣不同的伺服器不能夠更新同步狀態,但映射靜態內容的話非常好。
Anycast 是一個IP地址映射多個物理主機的路由技術。 美中不足,Anycast與TCP協議適應的不是很好,所以很少應用在那些方案中。
大多數DNS伺服器使用Anycast來獲得高效低延遲的DNS查找。

3. 瀏覽器給web伺服器發送一個HTTP請求

因為像Facebook主頁這樣的動態頁面,打開後在瀏覽器緩存中很快甚至馬上就會過期,毫無疑問他們不能從中讀取。
所以,瀏覽器將把一下請求發送到Facebook所在的伺服器:
GET HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [...]
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: facebook.com
Cookie: datr=1265876274-[...]; locale=en_US; lsd=WW[...]; c_user=2101[...]
GET 這個請求定義了要讀取的URL: 「」。 瀏覽器自身定義 (User-Agent 頭), 和它希望接受什麼類型的相應 (Accept and Accept-Encoding 頭). Connection頭要求伺服器為了後邊的請求不要關閉TCP連接。
請求中也包含瀏覽器存儲的該域名的cookies。可能你已經知道,在不同頁面請求當中,cookies是與跟蹤一個網站狀態相匹配的鍵值。這樣cookies會存儲登錄用戶名,伺服器分配的密碼和一些用戶設置等。Cookies會以文本文檔形式存儲在客戶機里,每次請求時發送給伺服器。
用來看原始HTTP請求及其相應的工具很多。作者比較喜歡使用fiddler,當然也有像FireBug這樣其他的工具。這些軟體在網站優化時會幫上很大忙。
除了獲取請求,還有一種是發送請求,它常在提交表單用到。發送請求通過URL傳遞其參數(e.g.: )。發送請求在請求正文頭之後發送其參數。

像「」中的斜杠是至關重要的。這種情況下,瀏覽器能安全的添加斜杠。而像「http: //example.com/folderOrFile」這樣的地址,因為瀏覽器不清楚folderOrFile到底是文件夾還是文件,所以不能自動添加 斜杠。這時,瀏覽器就不加斜杠直接訪問地址,伺服器會響應一個重定向,結果造成一次不必要的握手。

4. facebook服務的永久重定向響應

圖中所示為Facebook伺服器發回給瀏覽器的響應:
HTTP/1.1 301 Moved Permanently
Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Expires: Sat, 01 Jan 2000 00:00:00 GMT
Location:
P3P: CP="DSP LAW"
Pragma: no-cache
Set-Cookie: made_write_conn=deleted; expires=Thu, 12-Feb-2009 05:09:50 GMT;
path=/; domain=.facebook.com; httponly
Content-Type: text/html; charset=utf-8
X-Cnection: close
Date: Fri, 12 Feb 2011 05:09:51 GMT
Content-Length: 0
伺服器給瀏覽器響應一個301永久重定向響應,這樣瀏覽器就會訪問「」 而非「」。
為什麼伺服器一定要重定向而不是直接發會用戶想看的網頁內容呢?這個問題有好多有意思的答案。
其中一個原因跟搜索引擎排名有 關。你看,如果一個頁面有兩個地址,就像 和,搜索引擎會認為它們是兩個網站,結果造成每一個的搜索鏈接都減少從而降低排名。而搜索引擎知道301永久重定向是 什麼意思,這樣就會把訪問帶www的和不帶www的地址歸到同一個網站排名下。
還有一個是用不同的地址會造成緩存友好性變差。當一個頁面有好幾個名字時,它可能會在緩存里出現好幾次。
5. 瀏覽器跟蹤重定向地址

現在,瀏覽器知道了「」才是要訪問的正確地址,所以它會發送另一個獲取請求:
GET HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [...]
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Cookie: lsd=XW[...]; c_user=21[...]; x-referer=[...]
Host:
頭信息以之前請求中的意義相同。
6. 伺服器「處理」請求

伺服器接收到獲取請求,然後處理並返回一個響應。
這表面上看起來是一個順向的任務,但其實這中間發生了很多有意思的東西- 就像作者博客這樣簡單的網站,何況像facebook那樣訪問量大的網站呢!
Web 伺服器軟體
web伺服器軟體(像IIS和阿帕奇)接收到HTTP請求,然後確定執行什麼請求處理來處理它。請求處理就是一個能夠讀懂請求並且能生成HTML來進行響應的程序(像ASP.NET,PHP,RUBY...)。
舉 個最簡單的例子,需求處理可以以映射網站地址結構的文件層次存儲。像這個地 址會映射/httpdocs/folder1/page1.aspx這個文件。web伺服器軟體可以設置成為地址人工的對應請求處理,這樣 page1.aspx的發布地址就可以是。
請求處理
請求處理閱讀請求及它的參數和cookies。它會讀取也可能更新一些數據,並講數據存儲在伺服器上。然後,需求處理會生成一個HTML響應。
所 有動態網站都面臨一個有意思的難點 -如何存儲數據。小網站一半都會有一個SQL資料庫來存儲數據,存儲大量數據和/或訪問量大的網站不得不找一些辦法把資料庫分配到多台機器上。解決方案 有:sharding (基於主鍵值講數據表分散到多個資料庫中),復制,利用弱語義一致性的簡化資料庫。
委 托工作給批處理是一個廉價保持數據更新的技術。舉例來講,Fackbook得及時更新新聞feed,但數據支持下的「你可能認識的人」功能只需要每晚更新 (作者猜測是這樣的,改功能如何完善不得而知)。批處理作業更新會導致一些不太重要的數據陳舊,但能使數據更新耕作更快更簡潔。
7. 伺服器發回一個HTML響應

圖中為伺服器生成並返回的響應:
HTTP/1.1 200 OK
Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Expires: Sat, 01 Jan 2000 00:00:00 GMT
P3P: CP="DSP LAW"
Pragma: no-cache
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
X-Cnection: close
Transfer-Encoding: chunked
Date: Fri, 12 Feb 2011 09:05:55 GMT

2b3Tn@[...]
整個響應大小為35kB,其中大部分在整理後以blob類型傳輸。
內容編碼頭告訴瀏覽器整個響應體用gzip演算法進行壓縮。解壓blob塊後,你可以看到如下期望的HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"">
<html xmlns="" xml:lang="en"
lang="en" id="facebook" class=" no_js">

...
關於壓縮,頭信息說明了是否緩存這個頁面,如果緩存的話如何去做,有什麼cookies要去設置(前面這個響應里沒有這點)和隱私信息等等。
請注意報頭中把Content-type設置為「text/html」。報頭讓瀏覽器將該響應內容以HTML形式呈現,而不是以文件形式下載它。瀏覽器會根據報頭信息決定如何解釋該響應,不過同時也會考慮像URL擴展內容等其他因素。
8. 瀏覽器開始顯示HTML
在瀏覽器沒有完整接受全部HTML文檔時,它就已經開始顯示這個頁面了:

9. 瀏覽器發送獲取嵌入在HTML中的對象

在瀏覽器顯示HTML時,它會注意到需要獲取其他地址內容的標簽。這時,瀏覽器會發送一個獲取請求來重新獲得這些文件。
下面是幾個我們訪問facebook.com時需要重獲取的幾個URL:
圖片


CSS 式樣表


JavaScript 文件


這些地址都要經歷一個和HTML讀取類似的過程。所以瀏覽器會在DNS中查找這些域名,發送請求,重定向等等...
但 不像動態頁面那樣,靜態文件會允許瀏覽器對其進行緩存。有的文件可能會不需要與伺服器通訊,而從緩存中直接讀取。伺服器的響應中包含了靜態文件保存的期限 信息,所以瀏覽器知道要把它們緩存多長時間。還有,每個響應都可能包含像版本號一樣工作的ETag頭(被請求變數的實體值),如果瀏覽器觀察到文件的版本 ETag信息已經存在,就馬上停止這個文件的傳輸。
試著猜猜看「fbcdn.net」在地址中代表什麼?聰明的答案是"Facebook內容分發網路"。Facebook利用內容分發網路(CDN)分發像圖片,CSS表和JavaScript文件這些靜態文件。所以,這些文件會在全球很多CDN的數據中心中留下備份。
靜態內容往往代表站點的帶寬大小,也能通過CDN輕松的復制。通常網站會使用第三方的CDN。例如,Facebook的靜態文件由最大的CDN提供商Akamai來託管。
舉例來講,當你試著ping static.ak.fbcdn.net的時候,可能會從某個akamai.net伺服器上獲得響應。有意思的是,當你同樣再ping一次的時候,響應的伺服器可能就不一樣,這說明幕後的負載平衡開始起作用了。
10. 瀏覽器發送非同步(AJAX)請求

在Web 2.0偉大精神的指引下,頁面顯示完成後客戶端仍與伺服器端保持著聯系。
以 Facebook聊天功能為例,它會持續與伺服器保持聯系來及時更新你那些亮亮灰灰的好友狀態。為了更新這些頭像亮著的好友狀態,在瀏覽器中執行的 JavaScript代碼會給伺服器發送非同步請求。這個非同步請求發送給特定的地址,它是一個按照程式構造的獲取或發送請求。還是在Facebook這個例 子中,客戶端發送給ajax/chat/buddy_list.php一個發布請求來獲取你好友里哪個 在線的狀態信息。
提起這個模式,就必須要講講"AJAX"-- 「非同步JavaScript 和 XML」,雖然伺服器為什麼用XML格式來進行響應也沒有個一清二白的原因。再舉個例子吧,對於非同步請求,Facebook會返回一些JavaScript的代碼片段。
除了其他,fiddler這個工具能夠讓你看到瀏覽器發送的非同步請求。事實上,你不僅可以被動的做為這些請求的看客,還能主動出擊修改和重新發送它們。AJAX請求這么容易被蒙,可著實讓那些計分的在線游戲開發者們郁悶的了。(當然,可別那樣騙人家~)
Facebook聊天功能提供了關於AJAX一個有意思的問題案例:把數據從伺服器端推送到客戶端。因為HTTP是一個請求-響應協議,所以聊天伺服器不能把新消息發給客戶。取而代之的是客戶端不得不隔幾秒就輪詢下伺服器端看自己有沒有新消息。
這些情況發生時長輪詢是個減輕伺服器負載挺有趣的技術。如果當被輪詢時伺服器沒有新消息,它就不理這個客戶端。而當尚未超時的情況下收到了該客戶的新消息,伺服器就會找到未完成的請求,把新消息做為響應返回給客戶端。

㈤ 編程中的「語句級游標」

"定義為可延遲(deferrable)的約束可以指定為:

1. initially immediate(初始化立即執行)或
2. initially deferred(初始化延遲執行)。"

我知道什麼是延遲約束,但不明白什麼叫"初始化立即執行的可延遲約束"和"初始化延遲執行的可延遲約束"。請解釋二者的區別。還有,這些約束有什麼用途?這是通常輕易混淆的問題。我希望下面的例子能解釋清楚。初始化立即執行/延遲執行規定了在默認情況下應該如何執行約束:

初始化立即執行--在每條語句執行結束時檢驗約束

初始化延遲執行--一直等到事務完成後(或者調用set constraint immediate語句時)才檢驗約束

來看下面的代碼:
SQL> create table t
2( x int constraint
check_x check ( x > 0 )
deferrable
initially immediate,
3y int constraint
check_y check ( y > 0 )
deferrable
initially deferred
4)
5/
Table created.

SQL> insert into t values ( 1,1 );
1 row created.

SQL> commit;
Commit complete.

所以,當兩個約束同時滿足時才能正確無誤地插入行。但是,假如我試圖插入違反CHECK_X約束(初始化立即執行的約束)的行,則系統會立即檢驗約束,並得到下面的結果:

SQL> insert into t values ( -1,1);
insert into t values ( -1,1)
*
ERROR at line 1:
ORA-02290: check constraint
(OPS$TKYTE.CHECK_X) violated

由於CHECK_X是可延遲但初始化為立即執行的約束,所以這一行馬上被拒絕了。而CHECK_Y則不同,它不僅是可延遲的,而且初始化為延遲執行,這就意味著直到我用COMMIT命令提交事務或將約束狀態設置為立即執行時才檢驗約束。

SQL> insert into t values ( 1,-1);
1 row created.

現在它是成功的(總之到目前為止是成功的)。我將約束檢驗延遲到了執行COMMIT的時候:

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint
(OPS$TKYTE.CHECK_Y) violated

此時資料庫將事務回滾,因為違反約束導致了COMMIT語句的失敗。這些語句說明了初始化立即執行與初始化延遲執行約束之間的區別。initially(初始化)部分指定Oracle什麼時候會進行默認的約束檢驗--是在語句結束時[immediate(立即執行)],還是在事務結束時[deferred(延遲執行)]。我還要說明deferred(可延遲)子句有什麼用。我可以發出命令,讓所有可延遲的約束變為延遲執行的。注重,你也可以對一個約束使用該命令;你不必讓所有可延遲的約束都變為延遲執行的:

SQL> set constraints all deferred;
Constraint set.

SQL> insert into t values ( -1,1);
1 row created.

由於將初始化立即執行的約束設置為延遲執行的模式,這個語句似乎執行成功;但是,當我用COMMIT語句提交事務時,看一下會發生什麼:

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint
(OPS$TKYTE.CHECK_X) violated

事務提交失敗並回滾,因為在COMMIT語句之後對約束進行了檢驗。相反,我可以將初始化為延遲執行的約束變為"立即"執行的約束:

SQL> set constraints all immediate;
Constraint set.

SQL> insert into t values ( 1,-1);
insert into t values ( 1,-1)
*
ERROR at line 1:
ORA-02290: check constraint
(OPS$TKYTE.CHECK_Y) violated

前面在我提交前能執行的語句現在立即出了問題。因為我手動修改了默認的約
束模式。

延遲約束有哪些實際用處呢? 有很多。它主要用於物化視圖(快照)。這些視圖會使用延遲約束來進行視圖刷新。在刷新物化視圖的過程中,可能會破壞完整性,而且將不能逐句檢驗約束。但到執行COMMIT時,數據完整性就沒問題了,而且能滿足約束。沒有延遲約束,物化視圖的約束可能會使刷新過程不能成功進行。

使用延遲約束的另一個普遍原因是,當猜測是否需要更新父/子關系中的主鍵時,它有助於級聯更新。假如你將外鍵設為可延遲、但初始化為立即執行,那麼你就可以

將所有約束設置為可延遲。

將父鍵更新為一個新值--至此子關系的完整性約束不會被驗證。

將子外鍵更新為這個新值。

COMMIT--只要所有受更新影響的子記錄都指向現有的父記錄,這條命令就能成功執行。

假如沒有延遲約束,這一更新過程將極為艱難。參見asktom.oracle.com/~tkyte/update_cascade/index.Html中給出的沒有這一特性時進行級聯更新所必需的示例代碼!

此外,你可以在各種多語句事務中使用延遲約束,這些事務在處理的過程中需要暫時破壞完整性,但最後它們都會物歸原樣。

如何計算時間
你是如何計算asktom.oracle.com第一頁中AGE列顯示的時間的?我之所以問這個問題是因為我看到它有多種格式,如9個月3小時;2.3年;19個小時;等等。我是Oracle新手,想知道你們在使用哪種日期計演算法。

我就是使用Oracle8i第2版(8.1.6版)中介紹的使用已久但很好用的CASE語句:

Select
case
when sysdate-timestamp < 1/24
then round(24*60*(sysdate-timestamp))
' minutes old '
when sysdate-timestamp < 1
then round(24*(sysdate-timestamp))
' hours old '
when sysdate-timestamp < 14
then trunc(sysdate-timestamp)
' days old '
when sysdate-timestamp < 60
then trunc((sysdate-timestamp)/7)
' weeks old '
when sysdate-timestamp < 365
then round(months_between
(sysdate,timestamp))
' months old '
else round(months_between
(sysdate,timestamp)/12,1)
' years old '
end age, ...

假如你想在Oracle8i的PL/SQL中使用CASE語句,則會出現一個錯誤消息,因為PL/SQL語法分析程序不識別CASE語句。(請注重,在Oracle9i不存在這樣的問題。)為了避開Oracle8i的限制,你可以

將CASE語句隱藏在視圖當中,並用PL/SQL來查詢視圖。

使用嵌套的DECODE語句來代替CASE語句。

我本人願意使用視圖,但讀者Martin Burbridge在asktom.oracle.com 網站上公布了下面這段DECODE代碼:

decode(sign(sysdate-timestamp-1/24),-1,
round(24*60*(sysdate-timestamp))
' minutes old ',
decode(sign(sysdate-timestamp - 1), -1,
round(24*(sysdate-timestamp))
' hours old ',
decode(sign(sysdate-timestamp-14),-1,
trunc(sysdate-timestamp)
' days old ',
decode(sign(sysdate-timestamp-60),-1,
trunc((sysdate-timestamp)/7)
' weeks old ',
decode(sign(sysdate-timestamp-365),-1,
round(months_between
(sysdate,timestamp))
' months old ',
round(months_between
(sysdate,timestamp)/12,
1)
' years old '
))))) age

它與CASE語句的功能完全相同--只是不太明顯。

文件放在哪?
我正在考慮為一個應用程序設計些選項,利用它用戶可以上傳和存儲可供他人下載的文檔。文檔可以是平均大小為150K的Microsoft Word文檔。最初需要(從CD)移植18000到20000個文檔,當使用該應用程序時存儲數量會增加到大約25000個文檔。瀏覽器前端是用於上傳和下載的PL/SQL插件(PL/SQL cartridge)頁面。一開始,會有400到500人幾乎同時訪問該應用程序,兩周內天天將有300人訪問(分散訪問)。 文檔本身在資料庫中作為BLOB存儲。

從使用方面考慮,你覺得這樣的選項好嗎?它會過多佔用系統全局區(SGA)嗎?考慮到應用程序的需求以及前端(基於瀏覽器),除了保存為BLOB,還有沒有其他選擇,如文件系統?

我什麼都存在資料庫里。就是這樣。假如數據就是你的一切,無論它們有什麼樣的值,事實上都要放到資料庫中,在那裡數據可以得到專業化的治理、備份,恢復而且安全。除了這些實實在在的好處,你還可以索引及搜索文檔。(誠然,用文件系統也可以做這些,但在索引和文檔之間不存在完整性。)在資料庫中,你可以轉換文檔格式(例如,上傳一個DOC文件,而顯示為HTML格式)。你的數據是完全集成的、安全的、有備份的而且隨時供你使用。

在Oracle公司內部,我們將一個幾千吉位元組的資料庫作為整個公司的一個單一的文件伺服器。公司所有文檔都存在那裡,存在這樣一個單一的地方,可以對這些文檔進行備份、搜索、建立索引和訪問。在常規的文件系統中治理成千上萬的文檔是不可能的,即便文件系統能存下這些文檔。

至於SGA的問題,這完全在你。假如你不想把BLOB放在緩沖區里,可以對其使用NOCACHE,這樣你就不必擔心"過多佔用"SGA的問題了。

游標(Cursors)放在哪?
你能告訴我在編寫PL/SQL代碼時最好把游標放在哪嗎?我們應該把它們放在包說明中還是包體中?我問這些問題是因為和我一起工作的一名開發人員硬要把所有游標都放在包說明中。他告訴我這樣做才對。的確,假如在包中不止一次使用這些游標,我們應該把它們放在包說明中。但這個包里的所有游標都只使用一次,所以我認為應該把它們放到調用它們的過程/函數的聲明部分。我說得對嗎?把所有游標都放在包說明中有什麼優缺點?游標的放置位置影響性能嗎?

無論現在、過去還是將來我個人的偏好都是在大多數情況下使用隱式游標,也就是說根本就不顯式地定義游標!例如:

is
...
begin
....
for x in ( select * from emp )
loop

這個技巧用於大約50到100行以內的結果集時非凡好。比起顯式游標來我更喜歡這種方法是因為:

與使用顯式游標相比,使用它的CPU效率更高。

我可以瀏覽代碼,輕松地查看正在處理的數據。查詢過程就在我面前。

當查詢變大時,我可以使用視圖。我在視圖中仍能查看正在查詢的數據,但是視圖的復雜性被隱藏了起來。我不是把它隱藏在游標中,而是隱藏在視圖中。

有些時候你必須使用顯式游標,最常見的是要處理更大的結果集以及在使用FETCH語句時需要使用BULK COLLECT以保證系統性能的情況。當我必須使用顯式定義的游標時,我選擇定義在過程自身內(不僅在包體中,而且正好在包體的過程里)的局部游標。為什麼呢?

與使用全局游標(在說明中定義)相比,使用它的CPU效率更高。

我仍能瀏覽代碼,並能輕松地查看正在處理的數據。

它使我可以使用視圖,因為查詢是在過程中,而我不希望它影響到代碼的其餘部分。

游標屬於誰一目瞭然。

你理解這里的模式嗎?同樣,具有局部作用域(在過程中)的游標使用後會自動清除。沒有具有%isopen屬性的游標垃圾弄亂我的代碼。 (我的代碼從沒用過isopen"特性"。)我不必擔心:"你知道過程P1使用了cursor_x,我也使用了cursor_x,而且由於它們是同一個cursor_x,所以我們也許會互相干擾。"所以我沒有人們使用全局變數時總出現的問題。我以與查看全局變數相同的不信任級查看包說明或包體中的游標(這些游標不是在過程中定義的,但有全局作用域);多個過程訪問這些全局變數產生副作用的可能性太高了。只是在別無選擇時我才使用全局變數。

總而言之,優先選擇的順序為:
1.不用游標(select into, for x in ( select..... )

2.不管出於什麼原因被迫使用游標時都聲明局部游標,如:
a. 需要使用LIMIT子句的批量綁定
b. 引用游標(ref cursors)

我建議不要在包說明中聲明全局游標,理由是:

這會喪失封裝的良好特性。游標可以全局訪問,任何能訪問該包的人都能看到它。

這多少會降低一些性能(我強調多少,而且這不是主要方面)。

會降低包體的可讀性。

一般來講,使用全局參數是編寫代碼時應盡量避免的一個不好的習慣。

在Oracle9i資料庫中切換UNDO表空間

我這樣理解,假如我用ALTER SYSTEM命令將UNDO從一個表空間切換到另一個表空間,Oracle實際上只有在所有使用第一個表空間的活動事務都被提交或回滾後才切換到另一個表空間。我的理解對嗎?另外,假如我想知道在第一個UNDO表空間中哪些事務是活動的,我該怎麼辦?任何視圖或查詢都會有用。

你的理解不正確。 Oracle會馬上開始使用另一個UNDO表空間。下一個例子很好,它不僅證實了這一點,而且還為你提供所需要的查詢,這樣你就可以查看誰在使用要啟動的UNDO表空間中的哪個回滾段。

我要做的是先開始某一會話中的一個事務,但不用COMMIT命令提交。我通過查詢來看一看哪些會話正在使用哪些表空間中哪些回滾段。然後,我發出ALTER SYSTEM命令以
切換UNDO表空間,執行會話中的另一個事務,再執行查詢看一下誰在使用哪一個UNDO表空間。這時我要查看一下舊UNDO表空間中的舊事務和新UNDO表空間中的新事務。首先,我要看一看誰在使用什麼。該查詢將V$SESSION(得到會話信息)與V$TRANSACTION(只報告有活動事務的會話)及DBA_ROLLBACK_SEGS(呈交回滾段信息,如名稱和表空間)連接起來:

select a.username,
b.segment_name,
b.tablespace_name tspace
from v$session a,
dba_rollback_segs b,
v$transaction c
where a.taddr = c.addr
and b.segment_id = c.xisn
/

USERNAMESEGMENT_NAMETSPACE
---------------------------
OPS$TKYTE_SYS***U11$UNDO

這說明有一個事務是活動的,它使用名為UNDO的UNDO表空間。現在我要切換UNDO表空間:

alter system
set undo_tablespace = undo2;

現在我在這個會話中開始另一個事務:

update dept set deptno = deptno;
2 rows updated.

select a.username,
b.segment_name,
b.tablespace_name tspace
from v$session a,
dba_rollback_segs b,
v$transaction c
where a.taddr = c.addr
and b.segment_id = c.xisn
/

USERNAMESEGMENT_NAMETSPACE
---------------------------
OPS$TKYTE _SYS***U11$UNDO
OPS$TKYTE _SYS***U16$UNDO2

這時我看到這兩個表空間都在被使用。我還不能撤消UNDO表空間,因為它有活動事務,但它不能用於任何新的事務。

此時你也用到了你想要的查詢。

隨機性

怎樣用一條SQL語句在1到49之間創建6個各不相同的隨機數?

假如你有時從過程的角度考慮SQL是"基於集"的,你就能更深入地使用SQL。SQL被認為是一種非過程語言,但有時我發現,假如我考慮某些過程化的需要,它們也能幫助我設計一個查詢。

為了解答你這個問題,我需要:

生成一個從1到49的數字集合。我要從這個數字集合中抓取6個隨機數。

將這49個數隨機排序。這有點類似於為這49個數中的每個數分配一個隨機數,然後按照它們排序。

取結果集的前6個數。
為了生成由49個數組成的集合,我只需一個至少有49行的表。我發現ALL_OBJECTS是一個非常安全的表,能用於這種場合。它裡面始終有至少1000行,而且在各種系統上人人都能訪問它。

首先,我需要創建由49個數組成的集合。這條SQL查詢很簡單:

select rownum r
From all_objects
where rownum < 50

這樣便會生成數字1、2、3、……、49。接下來,我需要用這個集合並將它隨機排序。我會使用一個內聯視圖來完成這件事。在下面的語句中,用上面的查詢代替QUERY這個詞:

select r
from ( QUERY )
order by dbms_random.value

此時,假如你在SQL*Plus中反復運行order by dbms_ random.value查詢,你會發現總能得到49行,而且每次執行查詢都返回不同的順序。

現在我只需取前6個數。我要使用另一個內聯視圖將前面查詢的結果限制在前6行。完整的查詢是:

select r
from
( select r
from
( select rownum r
from all_objects
where rownum < 50 )
order by dbms_random.value )
where rownum <= 6
/

R
-----
8
20
32
&nbs

p;12
44
26

6 rows selected.

假如我再執行一次,將會得到6個不同的數。

Tom Kyte ([email protected]) 從1993年起一直在Oracle工作。Kyte是負責Oracle 治理、教育和保健集團的副總裁,也是"Effective Oracle by Design"(Oracle 出版社出版)和"EXPert One-on-One: Oracle"(Apress出版)兩書的作者。

㈥ 如何提高blob查詢效率

正常情況下,如果blob的數據量超過100kB,那麼最好使用分開單獨的文件來存儲blob數據性能會好一點。如果非要講Blob數據存儲在一個資料庫
文件中,那麼增加斗搜Page Size可以在一般情況下提升性能。具體還是與硬體、文件系統、操作系歷遲統有關系。
blob如果是單條讀取,效率不會差到那裡去,如果一個segment超過200g,在9206上倒是有點問題的,但可以對可能超過肢銷李200g的含有
blob類型的表進行hash分區,注意含有blob的表一般都是單條通過主鍵讀取的,如果要分頁等,肯定會影響到查詢效率的,可能的做法就是把blob
欄位分離到一個單獨的表,與主表一對一,然後再對blob做hash分區...

㈦ sqlite資料庫中能不能存放布爾類型的數據

sqlite資料庫中不支持布爾型。
SQLite將數據值的存儲劃分為以下幾種存儲類型:
NULL: 表示該值為NULL值。
INTEGER: 無符號整型值。
REAL: 浮點值。
TEXT: 文本字元串,存儲使用的編碼方式為UTF-8、UTF-16BE、UTF-16LE。
BLOB: 存儲Blob數據,該類型數據和輸入數據完全相同。
由於SQLite採用的是動態數據類型,而其他傳統的關系型資料庫使用的是靜態數據類型,即欄位可以存儲的數據類型是在表聲明時即以確定的,因此它們之間在數據存儲方面還是存在著很大的差異。在SQLite中,存儲分類和數據類型也有一定的差別,如INTEGER存儲類別可以包含6種不同長度的Integer數據類型,然而這些INTEGER數據一旦被讀入到內存後,SQLite會將其全部視為佔用8個位元組無符號整型。因此對於SQLite而言,即使在表聲明中明確了欄位類型,我們仍然可以在該欄位中存儲其它類型的數據。然而需要特別說明的是,盡管SQLite為我們提供了這種方便,但是一旦考慮到資料庫平台的可移植性問題,我們在實際的開發中還是應該盡可能的保證數據類型的存儲和聲明的一致性。除非你有極為充分的理由,同時又不再考慮資料庫平台的移植問題,在此種情況下確實可以使用SQLite提供的此種特徵。

㈧ 什麼是數據一致性和完整性,如何保證

數據一致性通常指關聯數據之間的邏輯關系是否正確和完整.而數據存儲的一致性模型則可以認為是存儲系統和數據使用者之間的一種約定.如果使用者遵循這種約定,則可以得到系統所承諾的訪問結果常用的一致性模型有:
a、嚴格一致性(linearizability, strict/atomic Consistency):讀出的數據始終為最近寫入的數據.這種一致性只有全局時鍾存在時才有可能,在分布式網路環境不可能實現.
b、順序一致性(sequential consistency):所有使用者以同樣的順序看到對同一數據的操作,但是該順序不一定是實時的.
c、因果一致性(causal consistency):只有存在因果關系的寫操作才要求所有使用者以相同的次序看到,對於無因果關系的寫入則並行進行,無次序保證.因果一致性可以看做對順序一致性性能的一種優化,但在實現時必須建立與維護因果依賴圖,是相當困難的.
d、管道一致性(PRAM/FIFO consistency):在因果一致性模型上的進一步弱化,要求由某一個使用者完成的寫操作可以被其他所有的使用者按照順序的感知到,而從不同使用者中來的寫操作則無需保證順序,就像一個一個的管道一樣. 相對來說比較容易實現.
e、弱一致性(weak consistency):只要求對共享數據結構的訪問保證順序一致性.對於同步變數的操作具有順序一致性,是全局可見的,且只有當沒有寫操作等待處理時才可進行,以保證對於臨界區域的訪問順序進行.在同步時點,所有使用者可以看到相同的數據.
f、 釋放一致性(release consistency):弱一致性無法區分使用者是要進入臨界區還是要出臨界區, 釋放一致性使用兩個不同的操作語句進行了區分.需要寫入時使用者acquire該對象,寫完後release,acquire-release之間形成了一個臨界區,提供 釋放一致性也就意味著當release操作發生後,所有使用者應該可以看到該操作.
g、最終一致性(eventual consistency):當沒有新更新的情況下,更新最終會通過網路傳播到所有副本點,所有副本點最終會一致,也就是說使用者在最終某個時間點前的中間過程中無法保證看到的是新寫入的數據.可以採用最終一致性模型有一個關鍵要求:讀出陳舊數據是可以接受的.
h、delta consistency:系統會在delta時間內達到一致.這段時間內會存在一個不一致的窗口,該窗口可能是因為log shipping的過程導致.這是書上的原話.我也搞不很清楚.資料庫完整性(Database Integrity)是指資料庫中數據的正確性和相容性.資料庫完整性由各種各樣的完整性約束來保證,因此可以說資料庫完整性設計就是資料庫完整性約束的設計.包括實體完整性.域完整性.參照完整性.用戶定義完整性.可以主鍵.check約束.外鍵來一一實現.這個使用較多.

㈨ oracle中有何技巧處理CLOB和BLOB的性能問題

blob存儲的是二進制,備蘆而clob存儲的是字元類型,除非你blob欄位里存儲的數據可以轉換為字元槐答類型,否則仿明帶是沒法轉換的,肯定會報錯!