MySQL 學習筆記

float 的精度

轉載 : http://blog.csdn.net/afternoone/article/details/4183556

要得到1位或2位精確小數的話,整數不能高於 32767

即:f<32767.99

因爲 2E15=32768

所以最多隻能正確處理0~32767的整數,

要得到3位 精確 小數的話,整數不能高於16383

即:f< 16383 .999

因爲 2E14=16384

要得到4位 精確 小數,整數不能高於2047

即:f< 2047 .9999

而 2E11=2048

要得到5位 精確 小數,整數不能高於127

即:f< 127 .99999

而 2E7=128

要得到6位 精確 小數,整數不能高於15

即:f<15 .999999

而 2E4=16

要得到7位 精確 小數,整數不能高於0

即:f< 0 .9999999

而 2E0=0

要得到8位以上的 精確 小數,是不可能的

即:f不存在

筆者得到了一些數據,不過得不到它變化的規律,還請高人指點

筆者得出結論的過程:

我建了這個表:

create table q(

 money float(15,3)

);

然後插入這個數據:

insert into q values(1234567.234);

再select一下讀出來後發現,它顯示的是:

1234567.250

然後插入這個數據:

insert into q values(12345672.34);

再select一下讀出來後發現,它顯示的是:

12345672.000

也就是說,有10數位與以上的話就會出現不準確的情況。

如果是這樣的話:

create table q(
money float(10,3)
);

insert into q values(1234567.3);

得到的是:

1234567.250

insert into q values(1234567);

得到的是:

1234567.000

insert into q values(123456.7);

得到的是:

123456.703

insert into q values(12345.67);

得到的是:

12345.670

insert into q values(32768.990);

得到:32768.988

insert into q values(32767.990);

得到:32767.990

經過很多次的試驗

要得到2位小數則 整數部分 最多不能超過32767。

表改爲:

create table q(
money float(30,10)
);

對純小數部分測試:

insert into q values(0.999);

得到:0.9990000129

insert into q values(0.9999);

得到 :0.9998999834

insert into q values(0.99999);

得到:0.9999899864

insert into q values(327.99);

得到 :327.9899902344

insert into q values(327.999);

得到:327.9989929199

表改爲:

create table q(
money float(7,2)
);

insert into q values(327.99);

得到:327.99

insert into q values(327.9999);

得到:328.00

insert into q values(32767.9999);

得到:32768.00

insert into q values(32767.99);

得到: 32767.99

insert into q values(99999.99);

得到: 99999.99

表改爲:

create table q(
money float(8,2)
);

insert into q values(999999.99);

得到 :1000000.00

insert into q values(999998.99);

得到:999999.00

insert into q values(130999.99);

得到:130999.99

表改爲:

create table q(
money float(9,3)
);

insert into q values(32768.990);

得到: 32768.988

insert into q values(32767.990);

得到:32767.990

insert into q values(16383.999);

得到:16383.999

要得到3位小數的話,整數不能高於16383

insert into q values(32767.90);

得到:32767.900

insert into q values(32768.90);

得到:32768.898

要得到1位小數的話,整數不能高於32767

MySQL數據類型和常用字段屬性總結

好比C++中,定義int類型需要多少字節,定義double類型需要多少字節一樣,MySQL對錶每個列中的數據也會實行嚴格控制,這是數據驅動應用程序成功的關鍵。M前言
好比C++中,定義int類型需要多少字節,定義double類型需要多少字節一樣,MySQL對錶每個列中的數據也會實行嚴格控制,這是數據驅動應用程序成功的關鍵。MySQL提供了一組可以賦給表中各個列的數據類型,每個類型都強制數據滿足爲該數據類型預先確定的一組規則,例如大小、類型及格式。
這裏先總結數據類型。MySQL中的數據類型大的方面來分,可以分爲:日期和時間、數值,以及字符串。下面就分開來進行總結。

日期和時間數據類型

MySQL數據類型           含義
date                3字節,日期,格式:2014-09-18
time                3字節,時間,格式:08:42:30
datetime            8字節,日期時間,格式:2014-09-18 08:42:30
timestamp           4字節,自動存儲記錄修改的時間
year                1字節,年份

數值數據類型

整型

MySQL數據類型 含義(有符號)
tinyint 1字節,範圍(-128~127)
smallint 2字節,範圍(-32768~32767)
mediumint 3字節,範圍(-8388608~8388607)
int 4字節,範圍(-2147483648~2147483647)
bigint 8字節,範圍(+-9.22*10的18次方)

上面定義的都是有符號的,當然了,也可以加上unsigned關鍵字,定義成無符號的類型,那麼對應的取值範圍就要翻翻了,比如:
tinyint unsigned的取值範圍爲0~255。

浮點型

MySQL數據類型 含義
float(m, d) 4字節,單精度浮點型,m總個數,d小數位
double(m, d) 8字節,雙精度浮點型,m總個數,d小數位
decimal(m, d) decimal是存儲爲字符串的浮點數

我在MySQL中建立了一個表,有一列爲float(5, 3);做了以下試驗:
1.插入123.45678,最後查詢得到的結果爲99.999;
2.插入123.456,最後查詢結果爲99.999;
3.插入12.34567,最後查詢結果爲12.346;
所以,在使用浮點型的時候,還是要注意陷阱的,要以插入數據庫中的實際結果爲準。

字符串數據類型

MySQL數據類型 含義
char(n) 固定長度,最多255個字符
varchar(n) 可變長度,最多65535個字符
tinytext 可變長度,最多255個字符
text 可變長度,最多65535個字符
mediumtext 可變長度,最多2的24次方-1個字符
longtext 可變長度,最多2的32次方-1個字符

1.char(n)和varchar(n)中括號中n代表字符的個數,並不代表字節個數,所以當使用了中文的時候(UTF8)意味着可以插入m箇中文,但是實際會佔用m*3個字節。
2.同時char和varchar最大的區別就在於char不管實際value都會佔用n個字符的空間,而varchar只會佔用實際字符應該佔用的空間+1,並且實際空間+1<=n。
3.超過char和varchar的n設置後,字符串會被截斷。
4.char的上限爲255字節,varchar的上限65535字節,text的上限爲65535。
5.char在存儲的時候會截斷尾部的空格,varchar和text不會。
6.varchar會使用1-3個字節來存儲長度,text不會。

其它類型

1.enum(“member1″, “member2″, … “member65535″)
enum數據類型就是定義了一種枚舉,最多包含65535個不同的成員。當定義了一個enum的列時,該列的值限制爲列定義中聲明的值。如果列聲明包含NULL屬性,則NULL將被認爲是一個有效值,並且是默認值。如果聲明瞭NOT NULL,則列表的第一個成員是默認值。
2.set(“member”, “member2″, … “member64″)
set數據類型爲指定一組預定義值中的零個或多個值提供了一種方法,這組值最多包括64個成員。值的選擇限制爲列定義中聲明的值。
數據類型屬性
上面大概總結了MySQL中的數據類型,當然了,上面的總結肯定是不全面的,如果要非常全面的總結這些內容,好幾篇文章都不夠的。下面就再來總結一些常用的屬性。
1.auto_increment
auto_increment能爲新插入的行賦一個唯一的整數標識符。爲列賦此屬性將爲每個新插入的行賦值爲上一次插入的ID+1。
MySQL要求將auto_increment屬性用於作爲主鍵的列。此外,每個表只允許有一個auto_increment列。例如:
複製代碼代碼如下:

id smallint not null auto_increment primary key
2.binary
binary屬性只用於char和varchar值。當爲列指定了該屬性時,將以區分大小寫的方式排序。與之相反,忽略binary屬性時,將使用不區分大小寫的方式排序。例如:
複製代碼代碼如下:

hostname char(25) binary not null
3.default
default屬性確保在沒有任何值可用的情況下,賦予某個常量值,這個值必須是常量,因爲MySQL不允許插入函數或表達式值。此外,此屬性無法用於BLOB或TEXT列。如果已經爲此列指定了NULL屬性,沒有指定默認值時默認值將爲NULL,否則默認值將依賴於字段的數據類型。例如:
複製代碼代碼如下:

subscribed enum(‘0’, ‘1’) not null default ‘0’
4.index
如果所有其他因素都相同,要加速數據庫查詢,使用索引通常是最重要的一個步驟。索引一個列會爲該列創建一個有序的鍵數組,每個鍵指向其相應的錶行。以後針對輸入條件可以搜索這個有序的鍵數組,與搜索整個未索引的表相比,這將在性能方面得到極大的提升。
複製代碼代碼如下:

create table employees
(
    id varchar(9) not null,
    firstname varchar(15) not null,
    lastname varchar(25) not null,
    email varchar(45) not null,
    phone varchar(10) not null,
    index lastname(lastname),
    primary key(id)
);

我們也可以利用MySQL的create index命令在創建表之後增加索引:
複製代碼代碼如下:

create index lastname on employees (lastname(7));
這一次只索引了名字的前7個字符,因爲可能不需要其它字母來區分不同的名字。因爲使用較小的索引時性能更好,所以應當在實踐中儘量使用小的索引。
5.not null
如果將一個列定義爲not null,將不允許向該列插入null值。建議在重要情況下始終使用not null屬性,因爲它提供了一個基本驗證,確保已經向查詢傳遞了所有必要的值。
6.null
爲列指定null屬性時,該列可以保持爲空,而不論行中其它列是否已經被填充。記住,null精確的說法是“無”,而不是空字符串或0。
7.primary key
primary key屬性用於確保指定行的唯一性。指定爲主鍵的列中,值不能重複,也不能爲空。爲指定爲主鍵的列賦予auto_increment屬性是很常見的,因爲此列不必與行數據有任何關係,而只是作爲一個唯一標識符。主鍵又分爲以下兩種:
(1)單字段主鍵
如果輸入到數據庫中的每行都已經有不可修改的唯一標識符,一般會使用單字段主鍵。注意,此主鍵一旦設置就不能再修改。
(2)多字段主鍵
如果記錄中任何一個字段都不可能保證唯一性,就可以使用多字段主鍵。這時,多個字段聯合起來確保唯一性。如果出現這種情況,指定一個auto_increment整數作爲主鍵是更好的辦法。
8.unique
被賦予unique屬性的列將確保所有值都有不同的值,只是null值可以重複。一般會指定一個列爲unique,以確保該列的所有值都不同。email varchar(45) unique
9 zerofill
zerofill屬性可用於任何數值類型,用0填充所有剩餘字段空間。例如,無符號int的默認寬度是10;因此,當“零填充”的int值爲4時,將表示它爲0000000004。例如:
複製代碼代碼如下:

orderid int unsigned zerofill not null

總結完畢!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章