mysql住址資料型別 MySQL中的資料型別

2021-10-18 21:59:00 字數 4602 閱讀 2137

一、char和varchar型別

char和varchar型別類似,都用來儲存字串,但是它們儲存和檢索字串的方式不同。char屬於固定長度的字元型別,varchar屬於可變長度的字元型別。例如:對於char(4)和varchar(4)這兩種型別定義來說:

(1)、''在char(4)中佔了4個位元組長度,varchar(4)則只占用乙個位元組的長度;

(2)、'ab'在char(4)中佔了4個位元組長度,varchar(4)中則只占用了3個位元組的長度;

(3)、'abcd'在char(4)中占用了4個位元組長度,在varchar(4)中則占用了5個位元組的長度;

為何在varchar型別中會多出乙個位元組長度呢?這是因為varchar型別將這多出的乙個位元組用於儲存varchar型別實際使用了多大的長度。char(4)和varchar(4)的檢索並不總是相同的,例如:

mysql> create table char_and_varchar (v varchar(4),c char(4));

query ok, 0 rows affected (0.20 sec)

mysql> insert into char_and_varchar values ('ab ','ab ');

query ok, 1 row affected (0.33 sec)

mysql> select concat(v,'cd'),concat(c,'cd') from char_and_varchar;

| concat(v,'cd') | concat(c,'cd') |

| ab cd | abcd |

1 row in set (0.35 sec)

由於char是固定長度的,所以它的處理速度比varchar快的多,但其缺點是浪費儲存空間,程式需要對尾部空格進行處理等缺點,所以多那些長度變化不大並且對查詢速度有較高要求的的資料可以考慮使用char型別來儲存。隨著mysql版本的不斷公升級,varchar資料型別的效能也將不斷提公升,varchar型別的應用範圍更加廣泛。

在mysql中,不同的儲存引擎對char和varchar的使用原則有所不同:

(1)、在myisam儲存引擎中,建議使用固定長度的字段型別代替可變長度的字段型別。

(2)、在memory儲存引擎中,目前都是用固定長度的資料行儲存,因此無論是char還是varchar型別,都將轉化為char型別處理。

(3)、在innodb儲存引擎中,建議使用varchar型別。

二、text和blob

在儲存少量字串的時候,可以使用char和varchar資料型別。在儲存較大的文字時,通常會選擇使用text或blob。兩者之間的主要差別是:blob能用來儲存二進位制資料,例如:**,而text只能用於儲存字元型別資料。text和blob中又分別包括text、mediumtext、longtext和blob、mediumblob、longblob三種不同的型別。它們之間的主要區別是儲存文字的長度不同和儲存位元組不同。

使用blob和text型別應注意的一些問題:

(1)、blob和text會引起一些效能問題,特別是在執行了大量的刪除操作時。刪除操作會在資料表中留下很大的「空洞」,以後填入這些「空洞」的記錄在插入效能上會有影響。為了提高效能,應定期使用optimizetable功能對這類表進行碎片整理,避免空洞導致效能問題。

mysql> create table t (id varchar(100),content blob,hash_value varchar(40));

query ok, 0 rows affected (0.03 sec)

mysql> insert into t values (1,repeat('beijing',2),md5(content));

query ok, 1 row affected (0.33 sec)

mysql> insert into t values (2,repeat('beijing',2),md5(content));

query ok, 1 row affected (0.01 sec)

mysql> insert into t values (2,repeat('beijing 2008',2),md5(content));

query ok, 1 row affected (0.01 sec)

mysql> select * from t;

| id | content | hash_value |

| 1 | beijingbeijing | 09746eef633dbbccb7997dfd795cff17 |

| 2 | beijingbeijing | 09746eef633dbbccb7997dfd795cff17 |

| 2 | beijing 2008beijing 2008 | 1c0ddb82cca9ed63e1cacbddd3f74082 |

3 rows in set (0.00 sec)

mysql> select * from t where hash_value=md5(repeat('beijing 2008',2));

| id | content | hash_value |

| 2 | beijing 2008beijing 2008 | 1c0ddb82cca9ed63e1cacbddd3f74082 |

1 row in set (0.00 sec)

合成索引只能用於精確匹配的場景,在一定程度上減少了磁碟i/o,提高了查詢效率。如果需要對blob、clob欄位進行模糊查詢,可以使用mysql的字首索引,即為字段的前n列建立索引。例如:

mysql> create index idx_blob on t (content(100));

query ok, 0 rows affected (0.09 sec)

records: 0 duplicates: 0 warnings: 0

mysql> show index from t \g

*************************** 1. row ***************************

table: t

non_unique: 1

key_name: idx_blob

seq_in_index: 1

column_name: content

collation: a

cardinality: 3

sub_part: 100

packed: null

null: yes

index_type: btree

comment:

index_comment:

1 row in set (0.00 sec)

mysql> desc select * from t where content like 'beijing%' \g

*************************** 1. row ***************************

id: 1

select_type: ******

table: t

type: all

possible_keys: idx_blob

key: null

key_len: null

ref: null

rows: 3

extra: using where

1 row in set (0.00 sec)

(3)、不要在不必要是檢索大型的blob或text欄位。

(4)、把blob或text欄位分離到單獨的表中。

三、浮點數和定點數

浮點數一般用於表示含有小數部分的數值。當乙個欄位被定義為浮點型別以後,如果插入資料的精度超過了該列定義的實際精度,則插入值會被四捨五入到實際定義的精度值,然後插入,四捨五入的過程不會報錯。mysql中的float、double(real)用來表示浮點數。

定點數不同於浮點數,定點數實際上是用字串形式存放的,所以定點數可以更精確的存放資料。如果插入資料的精度大於實際定義的精度,則mysql會發出告警,但資料按照實際精度四捨五入後插入(如果是在傳統模式下插入,則會報錯)。在mysql中,用decimal(或numberic)來表示定點數。

用浮點數儲存資料會存在誤差,在精度要求比較高的場景(如貨幣),應該使用定點數來存放資料。例如:

mysql> create table b (c1 float(10,2),c2 decimal(10,2));

query ok, 0 rows affected (0.37 sec)

mysql> insert into b values (131072.32,131072.32);

query ok, 1 row affected (0.00 sec)

mysql> select * from b;

| c1 | c2 |

| 131072.31 | 131072.32 |

1 row in set (0.00 sec)

四、日期型別

mysql提供的常用的日期型別有:date、time、datetime、timestamp,日期型別的選用原則:

(1)、應根據實際需要選擇能夠滿足應用的最小儲存的日期型別;

(2)、如果要記錄年月日時分秒,且年代比較久遠,最好使用datetime型別;

(3)、如果記錄的日期要被多時區的使用者所使用,那麼最好使用timestamp型別。

mysq中的l資料型別

1 數值型別 整型和小數 例如 int 3 數字僅用於顯示,不顯示資料真正的範圍 float 和 double 屬於浮點,沒有小數字數的說法,精度差,主要體現在自動進行四捨五入的顯示,decimal 字串 unsigned 屬性把資料範圍擴大了一倍 2 字元型別 字元 blob text enum ...

mysql資料型別用法 mysql資料型別和用法

歡迎進入linux社群論壇,與200萬技術人員互動交流 進入 mysql支援多種列型別 數值型別 日期 時間型別和字串 字元 型別。本章首先對這些列型別進行了概述,然後更加詳細地描述了各種列的型別,以及列型別儲存需求的總結。概述很簡單。關於具體列型別 歡迎進入linux社群論壇,與200萬技術人員互...

mysql 資料型別 真假 MySQL 資料型別

mysql基礎 資料型別 整型型別 根據所儲存的整數數值取值範圍不同,可分為以下五類 1 tinyint佔1個位元組 2 smallint佔2個位元組 3 mediumint 佔3個位元組 4 int佔4個位元組 5 bigint佔8個位元組 根據每種型別所佔的位元組數可確定其無符號整數和有符號整數...