真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

oracle小時怎么存儲 oracle存儲時間

在oracle數(shù)據(jù)庫中存入時間的最簡介的方法

insert into 表名 (DATE型字段名) values(to_date('2013-01-31 06:59:44','yyyy-mm-dd hh24:mi:ss')) ;

創(chuàng)新互聯(lián)是專業(yè)的公主嶺網(wǎng)站建設(shè)公司,公主嶺接單;提供成都做網(wǎng)站、成都網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行公主嶺網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

Oracle數(shù)據(jù)類型及存儲方式

概述

通過實(shí)例 全面而深入的分析oralce的基本數(shù)據(jù)類型及它們的存儲方式 以O(shè)RACLE G為基礎(chǔ) 介紹oralce g引入的新的數(shù)據(jù)類型 讓你對oracle數(shù)據(jù)類型有一個全新的認(rèn)識 揭示一些不為人知的秘密和被忽略的盲點(diǎn) 從實(shí)用和優(yōu)化的角度出發(fā) 討論每種數(shù)據(jù)類型的特點(diǎn) 從這里開始o(jì)racle之旅!

第一部份 字符類型

§ char

定長字符串 會用空格來填充來達(dá)到其最大長度 最長 個字節(jié)

. 新建一個測試表test_char 只有一個char類型的列 長度為

SQL create table test_char(colA char( ));

Table created

. 向這個表中插入一些數(shù)據(jù)

SQL insert into test_char values( a );

row inserted

SQL insert into test_char values( aa );

row inserted

SQL insert into test_char values( aaa );

row inserted

SQL insert into test_char values( aaaa );

row inserted

SQL insert into test_char values( aaaaaaaaaa );

row inserted

注意 最多只能插入 個字節(jié) 否是就報錯

SQL insert into test_char values( aaaaaaaaaaa );

insert into test_char values( aaaaaaaaaaa )

ORA : value too large for column PUB_TEST TEST_CHAR COLA (actual: maximum: )

. 使用dump函數(shù)可以查看每一行的內(nèi)部存數(shù)結(jié)構(gòu)

SQL select colA dump(colA) from test_char;

COLA?????? DUMP(COLA)

a????????? Typ= Len= :

aa???????? Typ= Len= :

aaa??????? Typ= Len= :

aaaa?????? Typ= Len= :

aaaaaaaaaa Typ= Len= :

注意 Typ= 表示數(shù)據(jù)類型的ID Oracle為每一種數(shù)據(jù)類型都進(jìn)行了編號 說明char類型的編號是

Len = 表示所在的內(nèi)部存儲的長度(用字節(jié)表示) 雖然第一例只存了一個字符 a 但是它還是占用了 個字節(jié)的空間

表示內(nèi)部存儲方式 可見oracle的內(nèi)部存儲是以數(shù)據(jù)庫字符集進(jìn)行存儲的

正好是字符a的ASCII碼

可以使用chr函數(shù)把ASCII碼轉(zhuǎn)成字符

SQL select chr( ) from dual;

CHR( )

a

要想知道一個字符的ASCII碼 可以使用函數(shù)ascii

SQL select ascii( a ) from dual;

ASCII( A )

正好是空格的ascii碼值

Char類型是定長類型 它總會以空格來填充以達(dá)到一個固定寬度

使用char類型會浪費(fèi)存儲空間

Oracle的數(shù)據(jù)類型的長度單位是字節(jié)

SQL select dump( 漢 ) from dual;

DUMP( 漢 )

Typ= Len= :

可見一個漢字在oracle中是占用了兩個字節(jié)的

英文字母或符號只占用一個字節(jié)

Char( )最多可存放 個漢字

§ varchar

是一種變長的字符類型 最多可占用 字節(jié)的存儲空間

創(chuàng)建一個表 只有一列 類型為varchar 長度為

SQL create table test_varchar( col varchar ( ));

Table created

插入一些數(shù)據(jù)

SQL insert into test_varchar values( a );

row inserted

SQL insert into test_varchar values( aa );

row inserted

SQL insert into test_varchar values( aaa );

row inserted

SQL insert into test_varchar values( aaaaaaaaaa );

row inserted

SQL insert into test_varchar values( aaaaaaaaaaa );

用dump函數(shù)查看每一行的內(nèi)部存儲結(jié)構(gòu)

SQL select col dump(col) from test_varchar;

COL??????? DUMP(COL)

a????????? Typ= Len= :

aa???????? Typ= Len= :

aaa??????? Typ= Len= :

aaaaaaaaaa Typ= Len= :

Typ= 說明varchar 類型在oracle中的類型編號為

Len代表了每一行數(shù)據(jù)所占用的字節(jié)數(shù)

后面是具體的存儲值

由此可見 varchar 是存多少就占用多少空間 比較節(jié)省空間的 不會像char那樣用空格填充

§ byte 和char

在 g中 字符類型的寬度定義時 可以指定單位

Byte就是字節(jié)

Char就是字符

Varchar ( byte) 長度為 個字節(jié)

Varchar ( char) 長度為 個字符所占的長度

Char( byte)長度為 個字節(jié)

Char( char) 長度為 個字符所占的長度

一個字符占用多少個字節(jié) 是由當(dāng)前系統(tǒng)采用的字符集來決定的

如一個漢字占用兩個字節(jié)

查看當(dāng)前系統(tǒng)采用的字符集

SQL select * from nls_database_parameters where parameter = NLS_CHARACTERSET ;

PARAMETER????????????????????? VALUE

NLS_CHARACTERSET?????????????? ZHS GBK

如果在定義類型時 不指定單位 默認(rèn)是按byte 即以字節(jié)為單位的

采用char為單位的好處是 使用多字節(jié)的字符集

比如 在ZHS GBK字符集中 一個漢字占用兩個字節(jié)

把數(shù)據(jù)表的某一列長度定義為可存放 個漢字 通過下面的定義就可以了

Create table test_varchar(col_char varchar ( char));

這樣相對簡單一些 在數(shù)據(jù)庫表設(shè)計時需要注意

繼續(xù)實(shí)驗 新建一個表 包含兩列 一列采用byte為單位 一列采用char為單位

SQL create table test_varchar (col_char varchar ( char) col_byte varchar ( byte));

Table created

Col_char列 定義為可存放 個字符

Col_byte 列 定義為可存放 個字節(jié)的字符

當(dāng)前的系統(tǒng)采用字符集為ZHS GBK 所以一個字符占兩個字節(jié)

試著在表中插入一些數(shù)據(jù)

SQL insert into test_varchar values( a a );

row inserted

SQL insert into test_varchar values( 袁 a );

row inserted

SQL insert into test_varchar values( 袁袁袁袁袁袁袁袁袁袁 aaaaaaaaaa );

row inserted

SQL insert into test_varchar values( 袁袁袁袁袁袁袁袁袁袁 袁袁袁袁袁袁袁袁袁袁 );

insert into test_varchar values( 袁袁袁袁袁袁袁袁袁袁 袁袁袁袁袁袁袁袁袁袁 )

ORA : value too large for column PUB_TEST TEST_VARCHAR COL_BYTE (actual: maximum: )

第一次 在兩列中都插入字符a

第二次 在col_char列插入字符 袁 在col_byte插入字符a

第三次 在col_char列中插入 個中文字符 袁 在col_byte插入 個字符a

第四次 在兩列中都插入中文字符 袁 時 報錯了 第二列長度不夠

再看看每一行的存儲結(jié)構(gòu)

SQL select col_char dump(col_char) from test_varchar ;

COL_CHAR???????????? DUMP(COL_CHAR)

a??????????????????? Typ= Len= :

袁?????????????????? Typ= Len= :

袁袁袁袁袁袁袁袁袁袁 Typ= Len= :

當(dāng)我們在col_char列插入 個漢字時 它的長度為

盡管我們在定義的時候是采用varchar ( char)

由此可見 oracle是根據(jù)當(dāng)前數(shù)據(jù)庫采用的字符集 每個字符的所占字節(jié)數(shù) X 字段長度來決定了該字段所占的字節(jié)數(shù)

在本例中 varchar ( char)相當(dāng)于varchar ( )

不信 我們可以試試看

SQL desc test_varchar ;

Name???? Type???????? Nullable Default Comments

COL_CHAR VARCHAR ( ) Y

COL_BYTE VARCHAR ( ) Y

當(dāng)采用多字節(jié)的字符集時 定義字段長度還是采用char為單位指定為佳 因為可以避免字段長度的問題

當(dāng)不知道當(dāng)前數(shù)據(jù)庫采用的字符集 一個字符占用多少字節(jié)時 可以使用lengthb函數(shù)

SQL select lengthb( 袁 ) from dual;

LENGTHB( 袁 )

§ char還是varchar

新建一個表 一列為char類型 一列為varchar 類型

SQL create table test_char_varchar(char_col char( ) varchar_col varchar ( ));

Table created

向該表中的兩列都插入相關(guān)的數(shù)據(jù)

SQL insert into test_char_varchar values( Hello World Hello World );

row inserted

SQL select * from test_char_varchar;

CHAR_COL???????????? VARCHAR_COL

Hello World????????? Hello World

以char_col列為條件查詢

SQL select * from test_char_varchar where char_col = Hello World ;

CHAR_COL???????????? VARCHAR_COL

Hello World????????? Hello World

以varchar_col列為條件查詢

SQL select * from test_char_varchar where varchar_col = Hello World ;

CHAR_COL???????????? VARCHAR_COL

Hello World????????? Hello World

似乎char 和varchar類型沒有什么兩樣 再看看下面的語句

SQL select * from test_char_varchar where varchar_col =char_col;

CHAR_COL???????????? VARCHAR_COL

這已經(jīng)看出他們并不一樣 這涉及到字符串比較的問題

因為已經(jīng)發(fā)生了隱式轉(zhuǎn)換 在與char列char_col進(jìn)行比較時 char_col列的內(nèi)容已經(jīng)轉(zhuǎn)換成了char( ) 在Hello World后面以空格進(jìn)行填充了 而varchar_col列并沒有發(fā)生這種轉(zhuǎn)換

如果要讓char_col列與varchar_col列相等 有兩種方法

第一種是 使用trim把char_col列的空格去掉

第二種是 使遙rpad把varchar_col列用空格進(jìn)行填充長度為 的字符

SQL select * from test_char_varchar where trim(char_col) = varchar_col;

CHAR_COL???????????? VARCHAR_COL

Hello World????????? Hello World

SQL select * from test_char_varchar where char_col = rpad(varchar_col );

CHAR_COL???????????? VARCHAR_COL

Hello World????????? Hello World

如果使用trim函數(shù) 如果char_col列上有索引 那么索引將不可用了

lishixinzhi/Article/program/Oracle/201311/17771

oracle 怎么樣存儲小數(shù)

oracle 關(guān)于數(shù)字存儲的主要有下面幾個:

NUMBER(P,S) 數(shù)字類型 P為整數(shù)位,S為小數(shù)位

DECIMAL(P,S) 數(shù)字類型 P為整數(shù)位,S為小數(shù)位

INTEGER 整數(shù)類型 小的整數(shù)

FLOAT 浮點(diǎn)數(shù)類型 NUMBER(38),雙精度

REAL 實(shí)數(shù)類型 NUMBER(63),精度更高

急,如何在Oracle中插入小時:分鐘類型的時間數(shù)據(jù)?

沒有這種數(shù)據(jù)類型

這種的話你可以直接采用

varchar2(5)--這個5就是字段長度,包括2位小時,2位分鐘,1位是那個冒號

探求Oracle數(shù)據(jù)庫怎樣存儲圖片

商品圖片,用戶上傳的頭像,其他方面的圖片。目前業(yè)界存儲圖片有兩種做法:

1、 把圖片直接以二進(jìn)制形式存儲在數(shù)據(jù)庫中

一般數(shù)據(jù)庫提供一個二進(jìn)制字段來存儲二進(jìn)制數(shù)據(jù)。比如MySQL中有個blob字段。Oracle數(shù)據(jù)庫中是blob或bfile類型

2、 圖片存儲在磁盤上,數(shù)據(jù)庫字段中保存的是圖片的路徑。

一、圖片以二進(jìn)制形式直接存儲在數(shù)據(jù)庫中

第一種存儲實(shí)現(xiàn)(PHP語言):

大體思路:

1、將讀取到的圖片用php程序轉(zhuǎn)化成二進(jìn)制形式。再結(jié)合insert into 語句插入數(shù)據(jù)表中的blob類型字段中去。

3、 從數(shù)據(jù)庫取出圖片展示的時候。則是直接發(fā)送圖片內(nèi)容

4、

$row=mysql_fetch_object($result);

Header( "Content-type: image/gif");

echo $row-this_image;

實(shí)現(xiàn)代碼如下:

$PicturePath = ‘/tmp/xxxjgjgj.jpg’;//假設(shè)這是上傳的圖片,php放在一個臨時文件夾。腳本執(zhí)行完畢后自動刪除了。

$imgStream = fread(fopen($PicturePath, "r");

$blob_img = fread(fopen($imgStream, "r"), filesize($PicturePath));

$sql =” INSERT INTO Images (this_image) VALUES ($blob_img)";

注:this_image就是數(shù)據(jù)表中一個blob字段類型的字段

================取出展示圖片代碼

$result=mysql_query("SELECT * FROM Images WHERE PicNum=$PicNum") or die("Cant perform Query");

$row=mysql_fetch_object($result);

Header( "Content-type: image/gif");

echo $row- this_image;

總結(jié):處理代碼感覺還真比較麻煩。其實(shí),我從來沒用過在數(shù)據(jù)庫中以二進(jìn)制存儲圖片的做法。我們用得更多的是存儲圖片的路徑,實(shí)際圖片是在磁盤上保存的(圖片二進(jìn)制放到數(shù)據(jù)庫,把數(shù)據(jù)庫的負(fù)擔(dān)弄重了)。

據(jù)我了解,互聯(lián)網(wǎng)環(huán)境中,大訪問量,數(shù)據(jù)庫速度和性能方面很重要。一般在數(shù)據(jù)庫存儲圖片的做法比較少,更多的是將圖片路徑存儲在數(shù)據(jù)庫中,展示圖片的時候只需要連接磁盤路徑把圖片載入進(jìn)來即可。因為圖片是屬于大字段。一張圖片可能1m到幾m。

有個原則:圖片盡量不要存儲在數(shù)據(jù)庫中(是指不要二進(jìn)制形式保存到字段,而只保存圖片的路徑)。這樣的大字段數(shù)據(jù)會加重數(shù)據(jù)庫的負(fù)擔(dān),拖慢數(shù)據(jù)庫。在大并發(fā)訪問的情況下很重要。這是一個經(jīng)驗。去看看dba對數(shù)據(jù)庫性能調(diào)優(yōu)方面的分析都能得到這個答案的:就是圖片不要存儲在數(shù)據(jù)庫中。

就像這個規(guī)則一樣:文章分為標(biāo)題、作者、添加時間、更新時間、文章內(nèi)容、文章關(guān)鍵字

文章內(nèi)容一般是比較長的。經(jīng)常使用text字段去存儲。文章的內(nèi)容就屬于大字段。一般文章內(nèi)容可以拆分到單獨(dú)一個表中去。不要與文章信息存儲在一張表里面。

我理解的原理是:mysql中一張表的數(shù)據(jù)是全部在一個數(shù)據(jù)文件中的。如果大字段的數(shù)據(jù)也存儲在里面。程序展示列表,比如文章列表。這個時候根本不需要展示文章內(nèi)容的。但是仍然會影響速度,數(shù)據(jù)庫查找數(shù)據(jù)其實(shí)就是掃描那個數(shù)據(jù)文件,文件容量越小,速度就會越快(為什么單表的容量在1g-2g的時候基本上要分表了)。拆分出去到一張單獨(dú)的表,就是單獨(dú)的文件了。我覺得,舉一反三,相互獨(dú)立,分離的思想不僅在系統(tǒng)開發(fā)中用到,在現(xiàn)實(shí)生活中經(jīng)常存在的。相互混合,就會造成相互影響。小巧,簡潔是一種思想。

可以看看這篇翻譯的文章,

http//developer.51cto.com/art/201211/364472.htm

作者建議,三種東西永遠(yuǎn)不要放到數(shù)據(jù)庫里,圖片,文件,二進(jìn)制數(shù)據(jù)。作者的理由是,

對數(shù)據(jù)庫的讀/寫的速度永遠(yuǎn)都趕不上文件系統(tǒng)處理的速度

數(shù)據(jù)庫備份變的巨大,越來越耗時間

對文件的訪問需要穿越你的應(yīng)用層和數(shù)據(jù)庫層

把圖片縮略圖存到數(shù)據(jù)庫里?很好,那你就不能使用nginx或其它類型的輕量級服務(wù)器來處理它們了。

給自己行個方便吧,在數(shù)據(jù)庫里只簡單的存放一個磁盤上你的文件的相對路徑,或者使用S3(備注:亞馬遜云服務(wù))或CDN之類的服務(wù)。

============================================================

關(guān)于mysql中的blob類型

bolb像int型那樣,分為blob、MEDIUMBLOB、LONGBLOB。其實(shí)就是從小到大,

blob 容量為64KB ,MEDIUMBLOB 容量為16M,LONGBLOB 容量為4G。

說實(shí)話,圖片用這樣子存儲用得還真少。使用php函數(shù)serialize進(jìn)行序列化的值,我看到有人存入這個字段中去。

php手冊:serialize返回字符串,此字符串包含了表示 value 的字節(jié)流,可以存儲于任何地方。

mysql中blob字段存儲圖片有個通信大小的設(shè)置:

圖片要傳輸給mysql存儲起來,那么需要涉及到數(shù)據(jù)通信。mysql中有個配置是限制通信數(shù)據(jù)大小的。

my.conf配置文件中的max_allowed_packet,mysql默認(rèn)的值是1M。

好多圖片尤其是原始圖可能不止1m。傳輸?shù)臄?shù)據(jù)(也就是圖片)超過這個設(shè)置大小。結(jié)果就會出錯

呵呵,限制挺多。感覺好麻煩。這樣子明顯占用與mysql交互的通信時間嘛。延長響應(yīng)時長了。我直接丟個圖片路徑”images/xxxx”給mysql。沒這么耗費(fèi)資源。

其實(shí)所謂的性能,最關(guān)鍵是數(shù)據(jù)庫性能。因為隨著數(shù)據(jù)庫數(shù)據(jù)量增大,大部分時間耗費(fèi)是在php,Java等語言等待數(shù)據(jù)庫返回數(shù)據(jù)的過程中耗費(fèi)時間。

網(wǎng)站訪問量大了后,具體的語言不是瓶頸,瓶頸都在數(shù)據(jù)庫。用c,,php,java,net都能操作mysql數(shù)據(jù)庫獲取數(shù)據(jù)。語言之間可能存在速度執(zhí)行差異,但是其實(shí)這種差別已經(jīng)很小了。至少我覺得,給予用戶感覺不到明顯。執(zhí)行相差0.0001秒用戶感覺并沒有明顯的區(qū)別??赡苷f,大并發(fā)(很多用戶同時訪問)的時候,就會體現(xiàn)到差別了。其實(shí)我覺得,大并發(fā)訪問是數(shù)據(jù)庫瓶頸。等待數(shù)據(jù)庫給予數(shù)據(jù)。沒達(dá)到一定級別實(shí)在體現(xiàn)不了差別。數(shù)據(jù)庫數(shù)據(jù)量達(dá)到一定級別。語言相差0.001s會給予用戶體驗上的差別。我想,這也是為什么php很適合做web開發(fā)了。解析頁面速度快(解釋型語言,不需要編譯)??梢杂胘ava來與數(shù)據(jù)庫打交道獲取數(shù)據(jù)。php不直接操作數(shù)據(jù)庫,而是調(diào)用java提供的數(shù)據(jù)接口,獲取數(shù)據(jù),馬上展示在頁面中。這是利用了php的頁面執(zhí)行速度快的一個優(yōu)勢。

備份圖片數(shù)據(jù)和遷移數(shù)據(jù)方便

圖片以二進(jìn)制形式存儲在數(shù)據(jù)庫,有一個好處:備份的時候方便。直接備份數(shù)據(jù)庫,圖片也跟著備份。換句話說,遷移環(huán)境的時候是方便。

而圖片放在磁盤上的話,數(shù)據(jù)庫中存儲的只是圖片路徑。備份數(shù)據(jù)庫后。磁盤上的圖片也要跟著備份才行。

不過我覺得,備份這個好處不是很明顯。圖片在磁盤上,備份磁盤也沒很大的事情。打包壓縮也可以了?;ヂ?lián)網(wǎng)環(huán)境畢竟與傳統(tǒng)的軟件開發(fā)不同,web開發(fā)比較關(guān)注網(wǎng)站速度。也就是數(shù)據(jù)庫的速度。就像互聯(lián)網(wǎng)開發(fā)中,有時候為了速度,用空間換時間的做法比較普遍,所以往往在設(shè)計數(shù)據(jù)庫的時候并不一定遵循傳統(tǒng)數(shù)據(jù)庫設(shè)計三大范式。

數(shù)據(jù)庫中保存的是圖片路徑的話,在web開發(fā)環(huán)境下,其實(shí)有個更好處,就是cdn加速。就是下面要進(jìn)行總結(jié)的地方。

二、數(shù)據(jù)庫中保存圖片路徑

一般是這樣子的:

按照年月日生成路徑。具體是按照年月日還是按照年月去生成路徑,根據(jù)自己需要(不一定是按照日期去生成)。

理解為什么要分散到多個文件夾中去才是關(guān)鍵,涉及到一個原理就明白了:

操作系統(tǒng)對單個目錄的文件數(shù)量是有限制的。當(dāng)文件數(shù)量很多的時候。從目錄中獲取文件的速度就會越來越慢。所以為了保持速度,才要按照固定規(guī)則去分散到多個目錄中去。

圖片分散到磁盤路徑中去。數(shù)據(jù)庫字段中保存的是類似于這樣子的”images/2012/09/25/ 1343287394783.jpg”

原來上傳的圖片文件名稱會重新命名保存,比如按照時間戳來生成,1343287394783. jpg。這樣子是為了避免文件名重復(fù),多個人往同一個目錄上傳圖片的時候會出現(xiàn)。

反正用什么樣的規(guī)則命名圖片,只要做到圖片名稱的唯一性即可。

比如網(wǎng)站的并發(fā)訪問量大,目錄的生成分得月細(xì)越好。比如精確到小時,一個小時都可以是一個文件夾。同時0.001秒有兩個用戶同時在上傳圖片(因為那么就會往同一個小時文件夾里面存圖片)。因為時間戳是精確到秒的。為了做到圖片名稱唯一性而不至于覆蓋,生成可以在在時間戳后面繼續(xù)加毫秒微秒等??偨Y(jié)的規(guī)律是,并發(fā)訪問量越大。就越精確就好了。

我現(xiàn)在還沒碰到需要這么精細(xì)的。概率比較少。

有個方面總結(jié)一下:為什么保存的磁盤路徑,是”images/2012/09/25/1343287394783.jpg”,而不是” /images/2012/09/25/ 1343287394783.jpg”(最前面帶有斜杠)

我的理解:

連那個斜杠都不要。這里也是做到方便以后系統(tǒng)擴(kuò)展。

在頁面中需要取出圖片路徑展示圖片的時候,如果是相對路徑,則可以使用”./”+”images/2012/09/25/1343287394783.jpg”進(jìn)行組裝。

如果需要單獨(dú)的域名(比如做cdn加速的時候)域名,img1.xxx.com,img2.xxx.com這樣的域名,

直接組裝 “http//img1.xxx.com/”+”images/2012/09/25/1343287394783.jpg”

當(dāng)然數(shù)據(jù)庫是可以在前面加斜杠/保存起來,/images/2012/09/25/ 1343287394783.jpg

其實(shí)不方便統(tǒng)一。比如相對路徑載入圖片的時候,則是”.”+” /images/2012/09/25/ 1343287394783.jpg”

可能我還沒體會到壞處,以后會遇到問題的。不過,遵循慣例不加斜杠” images/2012/09/25/ 1343287394783.jpg”就對了。

涉及到一個新問題:為什么大部分系統(tǒng)都不會域名保存進(jìn)去,像這樣子http//wwwxxx.com/images/2012/09/25/1343287394783.jpg保存到數(shù)據(jù)庫中

曾經(jīng)與一個上海的網(wǎng)友聊天,他也是習(xí)慣不會把域名保存數(shù)據(jù)庫中過去。但當(dāng)時我們兩聊的時候,他對”域名保存進(jìn)去的做法”與”不保存域名進(jìn)去”也沒有一個明確利弊。他就覺得,沒有什么明顯的區(qū)別啊。

了解的知識越多,越有利于我們做決定??赡芫褪且粋€”感覺區(qū)別不是很大”的影響下,去做一個決定,反而對后面是比較大的影響的。至少是增加自己的工作量了。

其實(shí)把域名保存進(jìn)去,也不是什么滔天大罪的事情。但凡是經(jīng)驗豐富的開發(fā)人員都不會這樣子做。這是一個經(jīng)驗積累出來的,所以上海那個網(wǎng)友也對此并沒有明顯的概念很正常,他說他不知道cdn方面的(當(dāng)然覺得存?zhèn)€域名進(jìn)去沒什么大不了的)。需要了解cdn知識,什么情況下會用到cdn知識。

雖然是做開發(fā)人員,不需要關(guān)注運(yùn)維和服務(wù)器之類的知識。不過了解一些就有利于理解了。

這里涉及到cdn加速。

關(guān)于cdn原理(就是內(nèi)容分發(fā)網(wǎng)絡(luò))

cdn,我理解其本質(zhì)就是為了解決距離遠(yuǎn)產(chǎn)生的速度問題,使用就近的服務(wù)。

從中國請求美國一臺服務(wù)器上的圖片。一般比較慢,因為距離這么遠(yuǎn),網(wǎng)絡(luò)傳輸是存在損耗的,距離越遠(yuǎn),傳輸?shù)臅r間就越長。一般會看到瀏覽器左下角顯示:“已響應(yīng),正在傳輸數(shù)據(jù)..”。這不是服務(wù)器本身問題了。實(shí)際上服務(wù)器早就響應(yīng)請求,把數(shù)據(jù)發(fā)給客戶端,但是網(wǎng)絡(luò)問題,就一直在傳輸,沒傳完了。

在中國,是南北距離遠(yuǎn)的問題。南北還會涉及到跨網(wǎng),南方用戶使用電信居多,北方用戶網(wǎng)通居多。兩個線路需要跨越,會有時間延遲。北京到廣州的距離,如果直接請求

cdn加速就是適應(yīng)這個需求產(chǎn)生的:現(xiàn)在不請求美國的服務(wù)器。直接在中國安放節(jié)點(diǎn)(節(jié)點(diǎn)是比較籠統(tǒng)的詞語,可以理解成一臺服務(wù)器,也可以理解成一個機(jī)房,就是一個點(diǎn)嘛),請求距離近的節(jié)點(diǎn)。這樣子就不需要那么遠(yuǎn)的距離了。

記得以前在長沙的網(wǎng)站,團(tuán)購以城市分站的形式。北京和長沙用的是同一套程序。服務(wù)器在長沙。北京用戶訪問北京站的時候,實(shí)際上需要遠(yuǎn)距離訪問長沙的服務(wù)器。速度怎么都快不起來。跟服務(wù)器性能完全沒關(guān)系。當(dāng)時不懂這些。不清楚怎么折騰??茨潜尽肚岸藘?yōu)化技巧》,想辦法去做js代碼壓縮,瀏覽器緩存之類的。實(shí)際上瞎折騰。不是說這些前端優(yōu)化不重要,哲學(xué)上有主次矛盾之分,瓶頸在哪里就去突破哪里。沒解決主要矛盾,問題并不會迎刃而解。當(dāng)時也不是數(shù)據(jù)庫瓶頸。如果去優(yōu)化數(shù)據(jù)庫。也不會明顯改善。就那點(diǎn)數(shù)據(jù)量。根本就達(dá)不到瓶頸。哪里談得上主要矛盾。隨著后來去其他公司工作,接觸一些東西,類似不找瓶頸的優(yōu)化例子發(fā)生在身邊好幾次了,先沒找到瓶頸就瞎去優(yōu)化。我的同事可能是抱著多多益善的心態(tài)去做的,但主要矛盾(技術(shù)上說是瓶頸)沒找到,也沒改善。

當(dāng)時如果沒想到是距離問題。也就不會想到cdn,當(dāng)時其實(shí)我根本不知道cdn服務(wù)。我只知道,google這些網(wǎng)站肯定在中國部署的服務(wù)器,要不然,中國用戶還去訪問美國的服務(wù)器,那再好的服務(wù)器都會速度慢的。

由于自己搭建cdn環(huán)境和機(jī)房的資金比較大(需要大量的服務(wù)器),也需要人力維護(hù)。反正一般的公司弄不起,其實(shí)根本不劃算。淘寶以前用商用的cdn服務(wù),后來商用的扛不住了,就搭建了自己的cdn網(wǎng)。我不知道新浪有沒有自己搭建,但其實(shí)我覺得跟淘寶的特點(diǎn)有關(guān),店鋪很多,無論是商品還是交易記錄總計起來商品很多的圖片,圖片都是靜態(tài)的部分,cdn本來就是用來做靜態(tài)的(圖片,css,js等)請求分發(fā)用的。

我之前在網(wǎng)上看到一句話,cdn網(wǎng)絡(luò)不是一般的公司玩得起的。

一般的公司自己搭建cdn網(wǎng)絡(luò)成本高,所以就有商業(yè)的cdn提供付費(fèi)租用服務(wù),這是一項很成熟的業(yè)務(wù),很多這樣的公司,大部分全國性的互聯(lián)網(wǎng)公司都會使用到cdn。

總結(jié):cdn服務(wù)。對于靜態(tài)內(nèi)容是非常適合的。所以像商品圖片,隨著訪問量大了后,租用cdn服務(wù),只需要把圖片上傳到他們的服務(wù)器上去。

例子:北京訪問長沙服務(wù)器,距離太遠(yuǎn)。我完全可以把商品圖片,放到北京的云服務(wù)(我覺得現(xiàn)在提供給網(wǎng)站使用的云存儲其實(shí)就是cdn,給網(wǎng)站提供分流和就近訪問)上去。這樣子北京用戶訪問的時候,實(shí)際上圖片就是就近獲取。不需要很長距離的傳輸。

自己用一個域名img.xxxcom來載入圖片。這個域名解析到北京的云服務(wù)上去。

做法:數(shù)據(jù)庫中保存的是” images/2012/09/25/1343287394783.jpg”,

這些圖片實(shí)際上不存儲在web服務(wù)器上。上傳到北京的cdn服務(wù)器上去。

我從數(shù)據(jù)庫取出來,直接”img.xxxcom/”+” images/2012/09/25/1343287394783.jpg”

比如如果還有多個,就命名img1.xxcom、img2.xxcom

反正可以隨便。所以如果把域名直接保存進(jìn)去。就顯得很麻煩了。遷移麻煩。

像淘寶,凡客,亞馬遜這些電子商務(wù)網(wǎng)站,我們看到請求的時候,下面往往會有

img1.xxx.cdncom

img2.xxx.cdncom

其實(shí)他們保存在數(shù)據(jù)庫中的是相對路徑。有些是不需要在數(shù)據(jù)庫保存的,縮略圖可以實(shí)時訪問的時候用程序生成(節(jié)省很多存儲空間)

實(shí)際上,把域名保存在數(shù)據(jù)庫中,非常不利于系統(tǒng)遷移。一旦換個域名的話,原來保存在數(shù)據(jù)庫中的是“wwwabc.om/images/xxxxxx“,因為路徑都在數(shù)據(jù)庫中寫死了。下回?fù)Q個域名就用不了了。那個時候自己去寫sql語句批量更新字段吧。

幾個術(shù)語:

icp,Internet Content Provider,也就是網(wǎng)絡(luò)內(nèi)容提供者。聯(lián)想到我們運(yùn)營一個網(wǎng)站需要icp備案了嗎?你自己運(yùn)營網(wǎng)站,你就是icp服務(wù)商

IDC(Internet Data Center),互聯(lián)網(wǎng)數(shù)據(jù)中心。IDC的概念,目前還沒有一個統(tǒng)一的標(biāo)準(zhǔn)。通俗點(diǎn),就是提供機(jī)房托管(服務(wù)器租用和托管),域名注冊之類的。

關(guān)于淘寶的圖片存儲

了解到:淘寶以前使用了商用的存儲。但是沒法滿足需求。據(jù)說,到2010年,淘寶網(wǎng)后端保存著286億張圖片。商用的系統(tǒng)系統(tǒng)沒法滿足需求的時候。他們就自己開發(fā)了一個tfs。大規(guī)模的小文件在磁盤上讀取,需要磁盤磁頭頻繁的尋道和換道。大并發(fā)情況下和大量的操作確實(shí)很麻煩。其實(shí)借鑒了當(dāng)時google公布的gfs設(shè)計論文。google有相冊服務(wù)。為每個用戶提供上傳圖片存儲。

估計,google是率先實(shí)現(xiàn)這種小文件網(wǎng)絡(luò)存儲系統(tǒng)的。

有個觀點(diǎn)比較好:對于老板們而言,往往覺得,用錢能解決的都不算問題。但問題在于,你遇到的問題,別人都沒遇到過。那這個時候你就沒有經(jīng)驗可以參考或者直接拿來使用。只有自己參考一些思路去創(chuàng)造技術(shù)了。

三、關(guān)于圖片進(jìn)行云存儲(cdn加速)

曾經(jīng)看過這個,這個是比較適合創(chuàng)業(yè)公司的。價格相對便宜

https//wwwupyun.com/

介紹提到,我們在全國各地部署了55個CDN節(jié)點(diǎn),500多臺服務(wù)器,電信,聯(lián)通,移動和教育網(wǎng)的4線帶寬。

其實(shí),現(xiàn)在的云存儲本質(zhì)就是一個cdn服務(wù)商。你把靜態(tài)的圖片上傳到他提供的服務(wù)器上去(ftp方式上傳或者api形式編寫程序上傳)。他為你做就近節(jié)點(diǎn)訪問。

計費(fèi)方式:按照流量付費(fèi),99元購買100g。怎么算流量。每次訪問文件的大小累加,比如一個1m的文件,訪問一次流量就加1m。

我個人理解,對于圖片的量不大的情況下,使用這種云服務(wù),好處不是節(jié)省存儲空間。你自己的服務(wù)器100g的空間可能創(chuàng)業(yè)型公司都沒用完,不是什么存儲空間不夠用,然后去用云存儲。以前我對cdn比較模糊,有這么點(diǎn)理解,或者以為是分散網(wǎng)站web服務(wù)器流壓力,服務(wù)器分流。這些好處是有的。但是,只要理解了cdn產(chǎn)生的背景和解決的關(guān)鍵問題后,就會明白云存儲關(guān)鍵好處在于:給用戶就近節(jié)點(diǎn)訪問,加速。

我覺得,如果不是出于這個考慮,或者達(dá)不到這樣的目的。用其他方案也完全可以替代。何必使用云存儲呢?就是你無非有實(shí)力做到全國多個節(jié)點(diǎn)去部署服務(wù),才需要租用cdn來幫你,畢竟他們是規(guī)模產(chǎn)生的效益,專注于解決這個領(lǐng)域。

oracle數(shù)據(jù)類型

按類型分為:字符串類型、數(shù)字類型、日期類型、LOB類型、LONG RAW RAW類型、ROWID UROWID類型。

在講敘字符串類型前,先要講一下編碼。字符串類型的數(shù)據(jù)可依編碼方式分成數(shù)據(jù)庫字符集(CHAR/VARCHAR2/CLOB/LONG)和國際字符集(NCHAR/NVARCHAR2/NCLOB)兩種。數(shù)據(jù)庫中的字符串?dāng)?shù)據(jù)都通過字符集將字符轉(zhuǎn)換為數(shù)字后(二進(jìn)制),才存儲到數(shù)據(jù)塊中。通過不同的編碼集轉(zhuǎn)換,即便是相同的字符,也可能會轉(zhuǎn)換成不同的二進(jìn)制編碼。這也是產(chǎn)生亂碼的原因。數(shù)據(jù)庫的編碼格式一般是在創(chuàng)建數(shù)據(jù)庫時指定的。當(dāng)然也可以修改數(shù)據(jù)庫的編碼。

一 字符串類型

1.1:CHAR類型 CHAR(size [BYTE | CHAR])

CHAR類型,定長字符串,會用空格填充來達(dá)到其最大長度。非NULL的CHAR(12)總是包含12字節(jié)信息。CHAR字段最多可以存儲2,000字節(jié)的信息。如果創(chuàng)建表時,不指定CHAR長度,則默認(rèn)為1。另外你可以指定它存儲字節(jié)或字符,例如 CHAR(12 BYTYE) CHAR(12 CHAR).一般來說默認(rèn)是存儲字節(jié)

注意:數(shù)據(jù)庫的NLS_CHARACTERSET 為AL32UTF8,即一個漢字占用三到四個字節(jié)。如果NLS_CHARACTERSET為ZHS16GBK,則一個字符占用兩個字節(jié)。

1.2: NCHAR類型

這是一個包含UNICODE格式數(shù)據(jù)的定長字符串。NCHAR字段最多可以存儲2,000字節(jié)的信息。它的最大長度取決于國家字符集。

1.3 VARCHAR類型

不要使用VARCHAR數(shù)據(jù)類型。使用VARCHAR2數(shù)據(jù)類型。

1.4: VARCHAR2類型

變長字符串,與CHAR類型不同,它不會使用空格填充至最大長度。VARCHAR2最多可以存儲4,000字節(jié)的信息。

1.5: NVARCHAR2類型

這是一個包含UNICODE格式數(shù)據(jù)的變長字符串。 NVARCHAR2最多可以存儲4,000字節(jié)的信息。

二. 數(shù)字類型

2.1 NUMBER類型

NUMBER(P,S)是最常見的數(shù)字類型,可以存放數(shù)據(jù)范圍為10130~10126(不包含此值),需要1~22字節(jié)(BYTE)不等的存儲空間。

P 是Precison的英文縮寫,即精度縮寫,表示有效數(shù)字的位數(shù),最多不能超過38個有效數(shù)字

S是Scale的英文縮寫,可以使用的范圍為-84~127。Scale為正數(shù)時,表示從小數(shù)點(diǎn)到最低有效數(shù)字的位數(shù),它為負(fù)數(shù)時,表示從最大有效數(shù)字到小數(shù)點(diǎn)的位數(shù)

下面是官方文檔的示例

Actual Data Specified As Stored As

123.89 NUMBER 123.89

123.89 NUMBER(3) 124

123.89 NUMBER(6,2) 123.89

123.89 NUMBER(6,1) 123.9

123.89 NUMBER(3) 124

123.89 NUMBER(4,2) exceeds precision

123.89 NUMBER(6,-2) 100

.01234 NUMBER(4,5).01234

.00012 NUMBER(4,5) .00012

.000127 NUMBER(4,5) .00013

.0000012 NUMBER(2,7) .0000012

.00000123 NUMBER(2,7) .0000012

1.2e-4 NUMBER(2,5) 0.00012

1.2e-5 NUMBER(2,5) 0.00001

2.2 INTEGER類型

INTEGER是NUMBER的子類型,它等同于NUMBER(38,0),用來存儲整數(shù)。若插入、更新的數(shù)值有小數(shù),則會被四舍五入。

2.3 浮點(diǎn)數(shù)

Oracle 數(shù)據(jù)庫提供了專為浮點(diǎn)數(shù)的兩種數(shù)值數(shù)據(jù)類型:

BINARY_FLOAT

BINARY_FLOAT 是 32 位、 單精度浮點(diǎn)數(shù)字?jǐn)?shù)據(jù)類型??梢灾С种辽?位精度,每個 BINARY_FLOAT 的值需要 5 個字節(jié),包括長度字節(jié)。

BINARY_DOUBLE

BINARY_DOUBLE 是為 64 位,雙精度浮點(diǎn)數(shù)字?jǐn)?shù)據(jù)類型。每個 BINARY_DOUBLE 的值需要 9 個字節(jié),包括長度字節(jié)。

在數(shù)字的列中,浮點(diǎn)數(shù)有小數(shù)精度。在 BINARY_FLOAT 或 BINARY_DOUBLE 的列中,浮點(diǎn)數(shù)有二進(jìn)制的精度。二進(jìn)制浮點(diǎn)數(shù)支持的特殊值無窮大和 NaN (不是數(shù)字)。

2.5 FLOAT類型

FLOAT類型也是NUMBER的子類型。

Float(n),數(shù) n 指示位的精度,可以存儲的值的數(shù)目。N 值的范圍可以從 1 到 126。若要從二進(jìn)制轉(zhuǎn)換為十進(jìn)制的精度,請將 n 乘以 0.30103。要從十進(jìn)制轉(zhuǎn)換為二進(jìn)制的精度,請用 3.32193 乘小數(shù)精度。126 位二進(jìn)制精度的最大值是大約相當(dāng)于 38 位小數(shù)精度。

三. 日期類型

日期類型用于存儲日期數(shù)據(jù),但是并不是使用一般的格式(2012-08-08)直接存儲到數(shù)據(jù)庫的。

3.1 DATE類型

DATE是最常用的數(shù)據(jù)類型,日期數(shù)據(jù)類型存儲日期和時間信息。雖然可以用字符或數(shù)字類型表示日期和時間信息,但是日期數(shù)據(jù)類型具有特殊關(guān)聯(lián)的屬性。為每個日期值,Oracle 存儲以下信息: 世紀(jì)、 年、 月、 日期、 小時、 分鐘和秒。一般占用7個字節(jié)的存儲空間。

3.2 TIMESTAMP類型

這是一個7字節(jié)或12字節(jié)的定寬日期/時間數(shù)據(jù)類型。它與DATE數(shù)據(jù)類型不同,因為TIMESTAMP可以包含小數(shù)秒,帶小數(shù)秒的TIMESTAMP在小數(shù)點(diǎn)右邊最多可以保留9位

3.3 TIMESTAMP WITH TIME ZONE類型

這是TIMESTAMP類型的變種,它包含了時區(qū)偏移量的值

3.4 TIMESTAMP WITH LOCAL TIME ZONE類型

3.5 INTERVAL YEAR TO MOTH

3.6 INTERVAL DAY TO SECOND

四. LOB類型

內(nèi)置的LOB數(shù)據(jù)類型包括BLOB、CLOB、NCLOB、BFILE(外部存儲)的大型化和非結(jié)構(gòu)化數(shù)據(jù),如文本、圖像、視屏、空間數(shù)據(jù)存儲。BLOB、CLOB、NCLOB類型

4.1 CLOB 數(shù)據(jù)類型

它存儲單字節(jié)和多字節(jié)字符數(shù)據(jù)。支持固定寬度和可變寬度的字符集。CLOB對象可以存儲最多 (4 gigabytes-1) * (database block size) 大小的字符

4.2 NCLOB 數(shù)據(jù)類型

它存儲UNICODE類型的數(shù)據(jù),支持固定寬度和可變寬度的字符集,NCLOB對象可以存儲最多(4 gigabytes-1) * (database block size)大小的文本數(shù)據(jù)。

4.3 BLOB 數(shù)據(jù)類型

它存儲非結(jié)構(gòu)化的二進(jìn)制數(shù)據(jù)大對象,它可以被認(rèn)為是沒有字符集語義的比特流,一般是圖像、聲音、視頻等文件。BLOB對象最多存儲(4 gigabytes-1) * (database block size)的二進(jìn)制數(shù)據(jù)。

4.4 BFILE 數(shù)據(jù)類型

二進(jìn)制文件,存儲在數(shù)據(jù)庫外的系統(tǒng)文件,只讀的,數(shù)據(jù)庫會將該文件當(dāng)二進(jìn)制文件處理

五. RAW LONG RAW類型

5.1 LONG類型

它存儲變長字符串,最多達(dá)2G的字符數(shù)據(jù)(2GB是指2千兆字節(jié), 而不是2千兆字符),與VARCHAR2 或CHAR 類型一樣,存儲在LONG 類型中的文本要進(jìn)行字符集轉(zhuǎn)換。ORACLE建議開發(fā)中使用CLOB替代LONG類型。支持LONG 列只是為了保證向后兼容性。CLOB類型比LONG類型的限制要少得多。 LONG類型的限制如下:

1.一個表中只有一列可以為LONG型。(Why?有些不明白)

2.LONG列不能定義為主鍵或唯一約束,

3.不能建立索引

4.LONG數(shù)據(jù)不能指定正則表達(dá)式。

5.函數(shù)或存儲過程不能接受LONG數(shù)據(jù)類型的參數(shù)。

6.LONG列不能出現(xiàn)在WHERE子句或完整性約束(除了可能會出現(xiàn)NULL和NOT NULL約束)

5.2 LONG RAW 類型,能存儲2GB 的原始二進(jìn)制數(shù)據(jù)(不用進(jìn)行字符集轉(zhuǎn)換的數(shù)據(jù))

5.3 RAW類型

用于存儲二進(jìn)制或字符類型數(shù)據(jù),變長二進(jìn)制數(shù)據(jù)類型,這說明采用這種數(shù)據(jù)類型存儲的數(shù)據(jù)不會發(fā)生字符集轉(zhuǎn)換。這種類型最多可以存儲2,000字節(jié)的信息

六. ROWID UROWID類型

在數(shù)據(jù)庫中的每一行都有一個地址。然而,一些表行的地址不是物理或永久的,或者不是ORACLE數(shù)據(jù)庫生成的。

例如,索引組織表行地址存儲在索引的葉子,可以移動。

例如,外部表的ROWID(如通過網(wǎng)關(guān)訪問DB2表)不是標(biāo)準(zhǔn)的ORACLE的rowid。

ORACLE使用通用的ROWID(UROWIDs)的存儲地址的索引組織表和外表。索引組織表有邏輯urowids的,和國外表的外urowids。UROWID這兩種類型的存儲在ROWID偽(堆組織的表的物理行id)。

創(chuàng)建基于邏輯的rowid在表中的主鍵。邏輯的rowid不會改變,只要主鍵不改變。索引組織表的ROWID偽UROWID數(shù)據(jù)類型。你可以訪問這個偽列,你會堆組織表的ROWID偽(即使用一個SELECT …ROWID語句)。如果你想存儲的rowid索引組織表,那么你就可以定義一列的表型UROWID到列檢索值的ROWID偽。


網(wǎng)站名稱:oracle小時怎么存儲 oracle存儲時間
URL標(biāo)題:http://weahome.cn/article/hjcijd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部