mysql怎么選char mysql char

mysql中char和varchar有什么區(qū)別?

mysql中char和varchar有什么區(qū)別?

我們擁有10余年網(wǎng)頁設(shè)計和網(wǎng)站建設(shè)經(jīng)驗,從網(wǎng)站策劃到網(wǎng)站制作,我們的網(wǎng)頁設(shè)計師為您提供的解決方案。為企業(yè)提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站、微信開發(fā)、微信平臺小程序開發(fā)、成都做手機網(wǎng)站、成都h5網(wǎng)站建設(shè)、等業(yè)務(wù)。無論您有什么樣的網(wǎng)站設(shè)計或者設(shè)計方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設(shè)計服務(wù)并滿足您的需求。

mysql中char與varchar的區(qū)別分析

1.都是用來存儲字符串的,只是他們的保存方式不一樣。

2.char有固定的長度,而varchar屬于可變長的字符類型。

char是一種固定長度的類型,varchar則是一種可變長度的類型,它們的區(qū)別是:

char(M)類型的數(shù)據(jù)列里,每個值都占用M個字節(jié),如果某個長度小于M,MySQL就會在它的右邊用空格字符補足.在varchar(M)類型的數(shù)據(jù)列里,每個值只占用剛好夠用的字節(jié)再加上一個用來記錄其長度的字節(jié)(即總長度為L+1字節(jié))。

在MySQL中用來判斷是否需要進行對據(jù)列類型轉(zhuǎn)換的規(guī)則

1、在一個數(shù)據(jù)表里,如果每一個數(shù)據(jù)列的長度都是固定的,那么每一個數(shù)據(jù)行的長度也將是固定的.

2、只要數(shù)據(jù)表里有一個數(shù)據(jù)列的長度的可變的,那么各數(shù)據(jù)行的長度都是可變的.

3、如果某個數(shù)據(jù)表里的數(shù)據(jù)行的長度是可變的,那么,為了節(jié)約存儲空間,MySQL會把這個數(shù)據(jù)表里的固定長度類型的數(shù)據(jù)列轉(zhuǎn)換為相應(yīng)的可變長度類型.

nvarchar和varchar,char,nchar有什么區(qū)別?

nchar(n)

包含 n 個字符的固定長度 Unicode 字符數(shù)據(jù)。n 的值必須介于 1 與 4,000 之間。存儲大小為 n 字節(jié)的兩倍。nchar 在 SQL-92 中的同義詞為 national char 和 national character。

nvarchar(n)

包含 n 個字符的可變長度 Unicode 字符數(shù)據(jù)。n 的值必須介于 1 與 4,000 之間。字節(jié)的存儲大小是所輸入字符個數(shù)的兩倍。所輸入的數(shù)據(jù)字符長度可以為零。nvarchar 在 SQL-92 中的同義詞為 national char varying 和 national character varying。注釋如果沒有在數(shù)據(jù)定義或變量聲明語句中指定 n,則默認(rèn)長度為 1。如果沒有使用 CAST 函數(shù)指定 n,則默認(rèn)長度為 30。

如果希望列中所有數(shù)據(jù)項的大小接近一致,則使用 nchar。

如果希望列中數(shù)據(jù)項的大小差異很大,則使用 nvarchar。

使用 nchar 或 nvarchar 的對象被賦予數(shù)據(jù)庫的默認(rèn)排序規(guī)則,除非使用 COLLATE 子句賦予特定的排序規(guī)則。

SET ANSI_PADDING OFF 不適用于 nchar 或 nvarchar。SET ANSI_PADDING ON 永遠(yuǎn)適用于 nchar 和 nvarchar。

二、char 和 varchar

固定長度 (char) 或可變長度 (varchar) 字符數(shù)據(jù)類型。char[(n)]

長度為 n 個字節(jié)的固定長度且非 Unicode 的字符數(shù)據(jù)。n 必須是一個介于 1 和 8,000 之間的數(shù)值。存儲大小為 n 個字節(jié)。char 在 SQL-92 中的同義詞為 character。

varchar[(n)]

長度為 n 個字節(jié)的可變長度且非 Unicode 的字符數(shù)據(jù)。n 必須是一個介于 1 和 8,000 之間的數(shù)值。存儲大小為輸入數(shù)據(jù)的字節(jié)的實際長度,而不是 n 個字節(jié)。所輸入的數(shù)據(jù)字符長度可以為零。varchar 在 SQL-92 中的同義詞為 char varying 或 character varying。注釋如果沒有在數(shù)據(jù)定義或變量聲明語句中指定 n,則默認(rèn)長度為 1。如果沒有使用 CAST 函數(shù)指定 n,則默認(rèn)長度為 30。

將為使用 char 或 varchar 的對象被指派數(shù)據(jù)庫的默認(rèn)排序規(guī)則,除非用 COLLATE 子句另外指派了特定的排序規(guī)則。該排序規(guī)則控制用于存儲字符數(shù)據(jù)的代碼頁。

支持多語言的站點應(yīng)考慮使用 Unicode nchar 或 nvarchar 數(shù)據(jù)類型以盡量減少字符轉(zhuǎn)換問題。如果使用 char 或 varchar:

如果希望列中的數(shù)據(jù)值大小接近一致,請使用 char。

如果希望列中的數(shù)據(jù)值大小顯著不同,請使用 varchar。

如果執(zhí)行 CREATE TABLE 或 ALTER TABLE 時 SET ANSI_PADDING 為 OFF,則一個定義為 NULL 的 char 列將被作為 varchar 處理。

當(dāng)排序規(guī)則代碼頁使用雙字節(jié)字符時,存儲大小仍然為 n 個字節(jié)。根據(jù)字符串的不同,n 個字節(jié)的存儲大小可能小于 n 個字符。

char ,varchar,nvarchar有什么區(qū)別

char 類型是一個字節(jié) char(8)只能存8字母

nchar 類型是雙字節(jié) nchar(8)能存8個漢字

varchar 類型是可變的、即如果 varchar(8)你只存了一個字母、在內(nèi)存中只占一個字節(jié)

char 類型如果 char(8)你只存了一個字母、在內(nèi)存中也占8個字節(jié)

sql 中int nvarchar char VARchar 有什么區(qū)別

1.int 類型:

從 -2^31 (-2,147,483,648) 到 2^31 - 1(2,147,483,647) 的整型數(shù)據(jù)(所有數(shù)字)。

存儲大小為 4 個字節(jié)。int 的 SQL-92 同義字為 integer。

2. char類型:

對英文(ASCII)字符占用1個字節(jié),對一個漢字占用2個字節(jié),CHAR存儲定長數(shù)據(jù)很方便,CHAR字段上的索引效率極高,比如定義char(10),那么不論你存儲的數(shù)據(jù)是否達到了10個字節(jié),都要占去10個字節(jié)的空間。因為是固定長度,所以速度效率高。比如定義char(10),那么不論你存儲的數(shù)據(jù)是否達到了10個字節(jié),都要占去10個字節(jié)的空間。因為是固定長度,所以速度效率高。

3. VARCHAR存儲變長數(shù)據(jù)

如果一個字段可能的值是不固定長度的,我們只知道它不可能超過10個字符,把它定義為 VARCHAR(10)是最合算的。VARCHAR類型的實際長度是它的值的實際長度+1。為什么“+1”呢?這一個字節(jié)用于保存實際使用了多大的長度。

Varchar類型:Varchar 的類型不以空格填滿,而Char則會填充滿為止,如varchar(100),但它的值只是"qian",所以它在數(shù)據(jù)庫中存的值就是"qian",而char 不一樣,如char(100),它的值是"qian",而實際上它在數(shù)據(jù)庫中是"qian "(qian后共有96個空格,就是把它填滿為100個字節(jié))。

注:由于char是以固定長度的,所以它的速度會比varchar快得多!但程序處理起來要麻煩一點,要用trim之類的函數(shù)把兩邊的空格去掉!

4. Nvarchar類型

為了與其他多種字符的轉(zhuǎn)換,如中文,音標(biāo)等,對每個英文(ASCII)字符都占用2個字節(jié),對一個漢字也占用兩個字節(jié),所有的字符都占用2個字節(jié)。

varchar(n):變長型字符數(shù)據(jù)類型,存儲最長長度為8,000 個字符

nvarchar(n):可變長度 Unicode 數(shù)據(jù),其最大長度為 4,000 字符.字節(jié)的存儲大小是所輸入字符個數(shù)的兩倍,就是說它是雙字節(jié)來存儲數(shù)據(jù)的。如果存儲數(shù)據(jù)如果存在單字節(jié)時,它也是以雙字節(jié)來占用存儲空間的。

varchar一般適用于英文和數(shù)字,Nvarchar適用中文和其他字符,其中N表示Unicode常量,可以解決多語言字符集之間的轉(zhuǎn)換問題。

char,nchar,varchar,nvarchar 有什么區(qū)別

高等教育出版社《數(shù)據(jù)庫技術(shù)及應(yīng)用》的81頁

char 儲存固定長度的字符串 最大長度 8000 個字節(jié)

varcahr 儲存可變長度的字符串 最大長度8000 個字節(jié)

nchar 儲存固定長度的unicode字符串 最大長度為 4000 個字符

nvarchar 儲存可變長度的unicode字符串 最大長度為 4000個字符

備注:有“var”前綴的都是可變的意思,就是說你在輸入字符時可以輸入任意長度不同的字符串

另外,你存名字:中文名就用nvarchar 吧 英文名就用varchar吧,

sql server 2005中 char()、nchar()、varchar()、nvarchar()有什么區(qū)別?

char和nchar一般用于數(shù)據(jù)長度基本相同的字段,如手機號都是11位,可以用char(11)。但如果長度不完全一樣,假設(shè)有8位的手機號,那會在數(shù)據(jù)后面自動補3個占位符,此時如果有l(wèi)ike '%phone%' 這樣的模糊查詢就有問題了

n一般用于中文存儲,char 10能存5個漢字或10個字符,nchar能存10個漢字或10個字符。

char的存儲效率比varchar稍微高點,就是要定長,根據(jù)不同項目需要吧

SQL中varchar和nvarchar有什么區(qū)別?

varchar(n)

長度為 n 個字節(jié)的可變長度且非 Unicode 的字符數(shù)據(jù)。n 必須是一個介于 1 和 8,000 之間的數(shù)值。存儲大小為輸入數(shù)據(jù)的字節(jié)的實際長度,而不是 n 個字節(jié)。

nvarchar(n)

包含 n 個字符的可變長度 Unicode 字符數(shù)據(jù)。n 的值必須介于 1 與 4,000 之間。字節(jié)的存儲大小是所輸入字符個數(shù)的兩倍。

兩字段分別有字段值:我和coffee

那么varchar字段占2×2+6=10個字節(jié)的存儲空間,而nvarchar字段占8×2=16個字節(jié)的存儲空間。

如字段值只是英文可選擇varchar,而字段值存在較多的雙字節(jié)(中文、韓文等)字符時用nvarchar

上面是一個總結(jié)介紹,通過上面的介紹,可以知道。

varchar(4) 可以輸入4個字線,也可以輸入兩個漢字

nvarchar(4) 可以輸四個漢字,也可以輸4個字母,但最多四個

sqlserver中,varchar和varing有什么區(qū)別

SQL SERVER中生成的語句中,字符串前加N。N 前綴必須是大寫字母。是Unicode編碼的意思,一般來說,英文字符是一個字節(jié)組成,但是國際上的字太多了,因此就用兩個字節(jié)來表示字符,滿足國際化的需要.

在字符串前面加上 N 代表存入數(shù)據(jù)庫時以 Unicode 格式存儲。N'string' 表示string是個Unicode字符串

Unicode 字符串的格式與普通字符串相似,但它前面有一個 N 標(biāo)識符(N 代表 SQL-92 標(biāo)準(zhǔn)中的國際語言 (National Language))。N 前綴必須是大寫字母。例如,'Michél' 是字符串常量而 N'Michél' 則是 Unicode 常量。Unicode 常量被解釋為 Unicode 數(shù)據(jù),并且不使用代碼頁進行計算。Unicode 常量確實有排序規(guī)則,主要用于控制比較和區(qū)分大小寫。為 Unicode 常量指派當(dāng)前數(shù)據(jù)庫的默認(rèn)排序規(guī)則,除非使用 COLLATE 子句為其指定了排序規(guī)則。Unicode 數(shù)據(jù)中的每個字符都使用兩個字節(jié)進行存儲,而字符數(shù)據(jù)中的每個字符則都使用一個字節(jié)進行存儲。有關(guān)更多信息,請參見使用 Unicode 數(shù)據(jù)。

Unicode 字符串常量支持增強的排序規(guī)則。

select '''a''' --輸出'a' 在sql語句中'用''來轉(zhuǎn)義,其他字符可以直接輸

存儲含有中文字符的最好有nvarchar

存儲只有英文、數(shù)字的最好用varchar

1.有var前綴的,表示是實際存儲空間是變長的,varchar,nvarchar

所謂定長就是長度固定的,當(dāng)輸入的數(shù)據(jù)長度沒有達到指定的長度時將自動以英文空格在其后面填充,使長度達到相應(yīng)的長度;而變長字符數(shù)據(jù)則不會以空格填充,比較例外的是,text存儲的也是可變長。

2.有n前綴的,n表示Unicode字符,即所有字符都占兩個字節(jié),nchar,nvarchar 字符中,英文字符只需要一個字節(jié)存儲就足夠了,但漢字眾多,需要兩個字節(jié)存儲,英文與漢字同時存在時容易造成混亂,Unicode字符集就是為了解決字符集這種不兼容的問題而產(chǎn)生的,它所有的字符都用兩個字節(jié)表示,即英文字符也是用兩個字節(jié)表示。

3.基于以上兩點來看看字段容量

char,varchar 最多8000個英文,4000個漢字

nchar,nvarchar 可存儲4000個字符,無論英文還是漢字

varchar與nvarchar的選擇("n"前綴)

使用varchar存儲含有非英文字符(比如中文,日文)時出現(xiàn)“??”的亂碼

使用nvarchar的一個非常好處就是在判斷字符串的時候可以不需要考慮中英文兩種字符的差別. 當(dāng)然,使用nvarchar存儲英文字符會增大一倍的存儲空間.但是在存儲代價已經(jīng)很低廉的情況下,優(yōu)先考慮兼容性會給你帶來更多好處的.

所以在Design的時候應(yīng)該盡量使用nvarchar來存儲數(shù)據(jù).只有在你確保該字段不會保存中文的時候,才采用varchar來存儲.

SqlServer中nvarchar和varchar的區(qū)別 1、各自的定義:

1.nvarchar(n) : 包含 n 個字符的可變長度 Unicode 字符數(shù)據(jù)。n 的值必須介于 1 與 4,000 之間。字節(jié)的存儲大小是所輸入字符個數(shù)的兩倍。所輸入的數(shù)據(jù)字符長度可以為零。

2.varchar[(n)]: 長度為 n 個字節(jié)的可變長度且非 Unicode 的字符數(shù)據(jù)。n 必須是一個介于 1 和 8,000 之間的數(shù)值。存儲大小為輸入數(shù)據(jù)的字節(jié)的實際長度,而不是 n 個字節(jié)。所輸入的數(shù)據(jù)字符長度可以為零。

2、區(qū)別:

1.從存儲方式上,nvarchar是按字符存儲的,而 varchar是按字節(jié)存儲的;

2.從存儲量上考慮, varchar比較節(jié)省空間,因為存儲大小為字節(jié)的實際長度,而 nvarchar是雙字節(jié)存儲;

3.在使用上,如果存儲內(nèi)容都是英文字符而沒有漢字等其他語言符號,建議使用varchar;含有漢字的使用nvarchar,因為nvarchar是使用Unicode編碼,即統(tǒng)一的字符編碼標(biāo)準(zhǔn),會減少亂碼的出現(xiàn)幾率;

4.如果你做的項目可能涉及不同語言之間的轉(zhuǎn)換,建議用nvarchar。

在oracle中varchar和varchar2有什么區(qū)別?

區(qū)別點:

varchar只對漢字和全角等字符占兩字節(jié),數(shù)字,英文字符等都是一個字節(jié)。

varchar2把空串等同于null處理,而varchar仍按照空串處理。

varchar2把所有字符都占兩字節(jié)處理(一般情況下),并且字符要用幾個字節(jié)存儲,要看數(shù)據(jù)庫使用的字符集。

oracle數(shù)據(jù)庫詳解

簡介

Oracle Database,又名Oracle RDBMS,或簡稱Oracle。是甲骨文公司的一款關(guān)系數(shù)據(jù)庫管理系統(tǒng)。它是在數(shù)據(jù)庫領(lǐng)域一直處于領(lǐng)先地位的產(chǎn)品??梢哉fOracle數(shù)據(jù)庫系統(tǒng)是目前世界上流行的關(guān)系數(shù)據(jù)庫管理系統(tǒng),系統(tǒng)可移植性好、使用方便、功能強,適用于各類大、中、小、微機環(huán)境。它是一種高效率、可靠性好的 適應(yīng)高吞吐量的數(shù)據(jù)庫解決方案。

軟件技術(shù)特點

技術(shù)層次深:如果期望進入IT服務(wù)或者產(chǎn)品公司(類似畢博、DELL、IBM等),Oracle技術(shù)能夠幫助提高就業(yè)的深度。Oracle技術(shù)已經(jīng)成為全球每個IT公司必選的軟件技術(shù)之一,熟練掌握Oracle技術(shù)能夠為從業(yè)人員帶來技術(shù)應(yīng)用上的優(yōu)勢,同時為IT技術(shù)的深入應(yīng)用起到非常 關(guān)鍵的作用。掌握 Oracle技術(shù),是IT從業(yè)人員了解全面信息化整體解決方案的基礎(chǔ)。

總結(jié)

oracle數(shù)據(jù)庫是由美國甲骨文設(shè)計的一款關(guān)于關(guān)系數(shù)據(jù)庫管理的軟件,具有強大且全面的數(shù)據(jù)管理功能,學(xué)習(xí)起來也比較繁瑣,一旦學(xué)有所成,就是這方面的精英。在IT行業(yè),這款軟件的用處很大,任何對于數(shù)據(jù)管理有要求的企業(yè)都會多多少少用到一些相關(guān)的內(nèi)容。

MySQL 數(shù)據(jù)表優(yōu)化設(shè)計(三):CHAR 和 VARCHAR 怎么選?

VARCHAR 和 CHAR 是兩種主要的字符串類型,用于存儲字符。不幸的是,由于實現(xiàn)的方式依賴于存儲引擎,因此很難解釋這些字符串在磁盤和內(nèi)存中如何存儲,除了除了常用的 InnoDB 和 MyISAM 外,假設(shè)你使用了其他存儲引擎,應(yīng)當(dāng)仔細(xì)閱讀存儲引擎的文檔。

VARCHAR 存儲可變長度的字符串,也是最常用的字符數(shù)據(jù)類型。相比固定長度的類型,VARCHAR 所需的存儲空間更小,它會盡可能少地使用存儲空間(例如,短的字符串占據(jù)的空間)。對于 MyISAM 來說,如果創(chuàng)建表的時候指定了 ROW_FORMAT=FIXED 的話,那么會使用固定的空間存儲字段而導(dǎo)致空間浪費。VARCHAR 使用1-2個額外的字節(jié)存儲字符串的長度:當(dāng)最大長度低于255字節(jié)的時候使用1個字節(jié),如果更多的話就使用2個字節(jié)。因此,拉丁字符集的 VARCHAR(10)會使用11個字節(jié)的存儲空間,而 VARCHAR(1000)則會使用1002個字節(jié)的存儲空間。

VARCHAR 由于能夠節(jié)省空間,因此可以改善性能。但是,由于長度可變,當(dāng)更新數(shù)據(jù)表的時候數(shù)據(jù)行的存儲空間會變化,這一定程度上會帶來額外的開銷。如果數(shù)據(jù)行的長度導(dǎo)致原有的存儲位置無法存放,那么不同的存儲引擎會做不同的處理。例如 MyISAM 可能產(chǎn)生數(shù)據(jù)行的碎片,而 InnoDB 需要進行磁盤分頁來存放更新后的數(shù)據(jù)行。

通常,如果最大的列長度遠(yuǎn)遠(yuǎn)高于平均長度的話(例如可選的備注字段),使用 VARCHAR 是劃算的,同時如果更新的頻次很低,那么碎片化也不會是一個問題。需要注意的是,如果使用的是 UTF-8字符集,則實際存儲的字節(jié)長度是根據(jù)字符定的。對于中文,推薦的存儲字符集是 utf8mb4。

CHAR 類型的長度是固定的,MySQL 會對每個字段分配足夠的存儲空間。 存儲CHAR 類型值的時候,MySQL 會移除后面多出來的空字符 。值是使用空字符進行對齊以便進行比較。對于短的字符串來說,使用 CHAR 更有優(yōu)勢,而如果所有的值的長度幾乎一致的話,就可以使用 CHAR。例如存儲用戶密碼的MD5值時使用 CHAR 就更合適,這是因為 MD5的長度總是固定的。同時,對于字段值經(jīng)常改變的數(shù)據(jù)類型來說,CHAR 相比 VARCHAR 也更有優(yōu)勢,因為 CHAR 不會產(chǎn)生碎片。對于很短的數(shù)據(jù)列,使用 CHAR 比 VARCHAR更高效,例如使用CHAR(1)存儲邏輯值的 Y 和 N,這種情況下只需要1個字節(jié),而 VARCHAR 需要2個字節(jié)。

對于移除空字符這個特性會感覺奇怪,我們舉個例子:

按上面的結(jié)果插入數(shù)據(jù)表后,string2中的前置空格不會移除,但使用 CHAR 類型存儲時,string3尾隨空格會被移除,使用 SQL 查詢結(jié)果來檢驗一下:

得出來的結(jié)果如下,可以看到 CHAR 類型的 string3后面的空格被移除了,而 VARCHAR類型的沒有。這種情況大多數(shù)時候不會有什么問題,實際在應(yīng)用中也經(jīng)常會使用 trim 函數(shù)移除兩端的空字符,但是如果確實需要存儲空格的時候,那就需要注意不要選擇使用 CHAR 類型:

數(shù)據(jù)如何存儲是由存儲引擎決定的,而且存儲引擎處理固定長度和可變長度的數(shù)據(jù)的方式并不相同。Memory 引擎使用固定大小的行,因此它需要分配最大可能的存儲空間——即便數(shù)據(jù)長度是可變的。但是,對于字符串的對齊和空字符截斷是由 MySQL 服務(wù)端完成的,因此所有存儲引擎都是一樣的。

與 CHAR 和 VARCHAR 相似的是 BINARY和 VARBINARY,用于存儲二進制字節(jié)字符,BINARY 的對齊使用字符0的字節(jié)值來對齊,并且再獲取值的時候不會截斷。如果需要使用字符的字節(jié)值而不是字符的話,使用 BINARY 會更高效,這是因為比較時,一方面不需要考慮大小寫,另一方面是MySQL一次只比較一個字節(jié)。

MYSQL中如何選擇合適的數(shù)據(jù)類型

MySQL 數(shù)據(jù)類型細(xì)分下來,大概有以下幾類:

數(shù)值,典型代表為 tinyint,int,bigint

浮點/定點,典型代表為 float,double,decimal 以及相關(guān)的同義詞

字符串,典型代表為 char,varchar

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

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

位類型

枚舉類型

集合類型

大對象,比如 text,blob

json 文檔類型

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

以上是幾個整數(shù)選型的例子。整數(shù)的應(yīng)用范圍最廣泛,可以用來存儲數(shù)字,也可以用來存儲時間戳,還可以用來存儲其他類型轉(zhuǎn)換為數(shù)字后的編碼,如 IPv4 等。示例 1用 int32 來存放 IPv4 地址,比單純用字符串節(jié)省空間。表 x1,字段 ipaddr,利用函數(shù) inet_aton,檢索的話用函數(shù) inet_ntoa。

查看磁盤空間占用,t3 占用最大,t1 占用最小。所以說如果整數(shù)存儲范圍有固定上限,并且未來也沒有必要擴容的話,建議選擇最小的類型,當(dāng)然了對其他類型也適用。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl總用量 3.0G3541825 861M -rw-r----- 1 mysql mysql 860M 12月 10 11:36 t1.ibd3541820 989M -rw-r----- 1 mysql mysql 988M 12月 10 11:38 t2.ibd3541823 1.2G -rw-r----- 1 mysql mysql 1.2G 12月 10 11:39 t3.ibd

二、浮點數(shù) / 定點數(shù)先說?浮點數(shù),float 和 double 都代表浮點數(shù),區(qū)別簡單記就是 float 默認(rèn)占 4 Byte。float(p) 中的 p 代表整數(shù)位最小精度。如果 p 24 則直接轉(zhuǎn)換為 double,占 8 Byte。p 最大值為 53,但最大值存在計算不精確的問題。再說?定點數(shù),包括 decimal 以及同義詞 numeric,定點數(shù)的整數(shù)位和小數(shù)位分別存儲,有效精度最大不能超過 65。所以區(qū)別于 float 的在于精確存儲,必須需要精確存儲或者精確計算的最好定義為 decimal 即可。示例 3創(chuàng)建一張表 y1,分別給字段 f1,f2,f3 不同的類型。mysql-(ytt/3305)-create table y1(f1 float,f2 double,f3 decimal(10,2));Query OK, 0 rows affected (0.03 sec)

三、字符類型字符類型和整形一樣,用途也很廣。用來存儲字符、字符串、MySQL 所有未知的類型??梢院唵握f是萬能類型!

char(10) 代表最大支持 10 個字符存儲,varhar(10) 雖然和 char(10) 可存儲的字符數(shù)一樣多,不同的是 varchar 類型存儲的是實際大小,char 存儲的理論固定大小。具體的字節(jié)數(shù)和字符集相關(guān)。示例 4例如下面表 t4 ,兩個字段 c1,c2,分別為 char 和 varchar。mysql-(ytt/3305)-create table t4 (c1 char(20),c2 varchar(20));Query OK, 0 rows affected (0.02 sec)

所以在 char 和 varchar 選型上,要注意看是否合適的取值范圍。比如固定長度的值,肯定要選擇 char;不確定的值,則選擇 varchar。

四、日期類型日期類型包含了 date,time,datetime,timestamp,以及 year。year 占 1 Byte,date 占 3 Byte?!?/p>

time,timestamp,datetime 在不包含小數(shù)位時分別占用 3 Byte,4 Byte,8 Byte;小數(shù)位部分另外計算磁盤占用,見下面表格。

請點擊輸入圖片描述

請點擊輸入圖片描述

請點擊輸入圖片描述

注意:timestamp 代表的時間戳是一個 int32 存儲的整數(shù),取值范圍為 '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. 如果時間有可能超過時間戳范圍,優(yōu)先選擇 datetime。2. 如果需要單獨獲取年份值,比如按照年來分區(qū),按照年來檢索等,最好在表中添加一個 year 類型來參與。3. 如果需要單獨獲取日期或者時間,最好是單獨存放,而不是簡單的用 datetime 或者 timestamp。后面檢索時,再加函數(shù)過濾,以免后期增加 SQL 編寫帶來額外消耗。

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

示例 5

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

當(dāng)然了,這種情形占用額外的磁盤空間。如果想在易用性與空間占用量大這兩點來折中,可以用 MySQL 的虛擬列來實時計算。比如假設(shè) c5 字段不存在,想要得到 c5 的結(jié)果。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 對應(yīng)了 char 和 varchar 的二進制存儲,相關(guān)的特性都一樣。不同的有以下幾點:

binary(10)/varbinary(10) 代表的不是字符個數(shù),而是字節(jié)數(shù)。

行結(jié)束符不一樣。char 的行結(jié)束符是 \0,binary 的行結(jié)束符是 0x00。

由于是二進制存儲,所以字符編碼以及排序規(guī)則這類就直接無效了。

示例 6

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

切記!這里要提前計算好 @a 占用的字節(jié)數(shù),以防存儲溢出。

六、位類型

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

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

示例 7

創(chuàng)建表 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)

過濾數(shù)據(jù)也一樣,二進制或者直接十進制都行。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 非常優(yōu)化的一種用法。

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

那現(xiàn)在我給表 c1 簡單的造點測試數(shù)據(jù)。

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

把 c1 的數(shù)據(jù)全部插入 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。適合提前規(guī)劃好了所有已經(jīng)知道的值,且未來最好不要加新值的情形。枚舉類型有以下特性:

1. 最大占用 2 Byte。2. 最大支持 65535 個不同元素。3. MySQL 后臺存儲以下標(biāo)的方式,也就是 tinyint 或者 smallint 的方式,下標(biāo)從 1 開始。4. 排序時按照下標(biāo)排序,而不是按照里面元素的數(shù)據(jù)類型。所以這點要格外注意。

示例 8

創(chuàng)建表 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. 內(nèi)部以二進制位的方式存儲,對應(yīng)的下標(biāo)如果以十進制來看,就分別為 1,2,4,8,...,pow(2,63)。3. 最大支持 64 個不同的元素,重復(fù)元素的插入,取出來直接去重。4. 元素之間可以組合插入,比如下標(biāo)為 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

九、數(shù)據(jù)類型在存儲函數(shù)中的用法

函數(shù)里除了顯式聲明的變量外,默認(rèn) session 變量的數(shù)據(jù)類型很弱,隨著給定值的不同隨意轉(zhuǎn)換。

示例 10

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

簡單調(diào)用下。

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

總結(jié)

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

本文題目:mysql怎么選char mysql char
URL地址:http://muchs.cn/article8/dohspip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、營銷型網(wǎng)站建設(shè)、網(wǎng)站維護、網(wǎng)頁設(shè)計公司域名注冊、微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)