mysql中定義資料欄位的型別對你資料庫的優化是非常重要的;
mysql支援多種型別,大致可以分為三類:數值、日期/時間和字串(字元)型別;
整數型別
int(n)中n的涵義
定義了 init(5)zerofill 當和int(10)join時顯示寬度對不上有可能出現臨時表
n表示顯示寬度為n,但仍佔4位元組儲存,儲存範圍不變;
>create table int_test(a int zerofill not null auto_increment, primary key(a));>createtable int_test_4(a int(4) zerofill not null auto_increment, primary key(a));>select * fromint_test_4;+------------+
|a |
| 0001 |
| 0002 |
|2147483648 |
>select * fromint_test;+------------+
|a |
|0000000001 |
|0000000002 |
|2147483648 |
關於浮點數型別:1)能不用到盡量不要用,2)浮點數不能用在等號比較的場景
建議tinyint替換enum
日期和時間型別
表示時間值的日期和時間型別為datetime、date、timestamp、time和year。
mysql5.6不支援year(2)
日期型別注意事項
日期轉換:cast(datatime_col as date)
>select now()+0;
5.6的us支援
>select now(4),microsecond(now(4));
|now(4) |microsecond(now(4)) |
|2016-04-16 08:50:01.6589 | 658900 |
timestamp5.6.6之後支援 null
建議datetime 來替換timestamp
字串型別
字串型別指char、varchar、binary、varbinary、blob、text、enum和set。該節描述了這些型別如何工作以及如何在查詢中使用這些型別;
字元型
varchar與char的區別
char是一種固定長度的型別,varchar則是一種可變長度的型別,它們的區別是: char(m)型別的資料列裡,每個值都占用m個位元組,如果某個長度小於m,mysql就會在它的右邊用空格字元補足.(在檢索操作中那些填補出來的空格字元將被去掉)在varchar(m)型別的資料列裡,每個值只占用剛好夠用的位元組再加上乙個用來記錄其長度的位元組(即總長度為l+1位元組)varchar儲存可變長字串,小於255位元組時需要1個額外位元組(大於255需要2個額外位元組)儲存長度,最大長度為65532位元組(所有列總和);
char儲存定長,讀取時會截斷末尾空格,長度最大為255字元;
1)char(m)的涵義:
實際分配的長度是:m*字元編碼長度=儲存空間
例如:儲存了255個字元 中文漢字是占用3個位元組
255*3 = 765 一共是765位元組
2)varchar(n)中n的涵義
最大儲存n個字元;varchar(5)和varchar(200)儲存hello所佔空間一樣,但後者在排序時會消耗更多記憶體,因為order by col採用fixed_length計算col長度(memory引擎也一樣)
例如:varchar(200)utf8下面占用多少位元組
200*3+ 2
varchar(64) utf8
64*3=192<255
192+1=193
建議:通常使用mysql是innodb引擎 innodb引擎本來就是變長儲存
行儲存著:
trx_id, row-id,rollback, filed_pointer, null-flag, filed1,....
innodb儲存引擎推薦varchar
char更快是針對myisam這種堆表 char 定長分配會更快一點
計算例子
舉兩個例說明一下實際長度的計算。
a)若乙個表只有乙個varchar型別,如定義為
createtable t4(c varchar(n)) charset=gbk;
則此處n的最大值為(65535-1-2)/2= 32766。
減1的原因是實際行儲存從第二個位元組開始』;
減2的原因是varchar頭部的2個位元組表示長度;
除2的原因是字元編碼是gbk。
b)若乙個表定義為
createtable t4(c int, c2 char(30), c3 varchar(n)) charset=utf8;
則此處n的最大值為 (65535-1-2-4-30*3)/3=21812
減1和減2與上例相同;
減4的原因是int型別的c佔4個位元組;
減30*3的原因是char(30)占用90個位元組,編碼是utf8。
使用kettle匯入excel資料到mysql
kettle跑起來,要求有jre環境。另外,如果連線mysql資料庫的話,kettle本身是不包含mysql連線的jar,需要你手動放到安裝目錄的lib目錄下。如果是kettle啟動後放入的,需要重啟一下kettle。資料庫表設計圖 其中 id是主鍵 role code是角色 匯入時,根據excel...
python 取oracle資料轉存至mysql
由於grafana的oracle外掛程式需要付費,所以只能想想辦法,於是就用oracle的資料轉到mysql資料庫裡面。其實也很簡單,需要提前安裝好python和oracle資料庫驅動cx oracle 和mysql 驅動,具體可以自己搜尋。指令碼如下 usr bin python coding u...
Datax從Hive中匯出資料寫入到MySQL
hive1.2.x 版本支援的資料型別已經很豐富了,但是datax目前還支援不了這麼多的資料型別,如果不注意的話,將會丟擲很多奇怪的問題 比如 髒資料 的問題。datax 內部型別 hive表 資料型別 long tinyint,smallint,int,bigint double float,do...