Mysql数据类型之浮点与二进制型数据使用案例总结
Mysql數(shù)據(jù)類型之浮點(diǎn)與二進(jìn)制型數(shù)據(jù)
數(shù)據(jù)類型概述
Mysql里的數(shù)據(jù)類型主要有數(shù)值型(整形、浮點(diǎn)型)、時(shí)間類型、字符串類型、JSON類型、坐標(biāo)類型、混合類型(整數(shù)或字符串)。
數(shù)值型范圍表格
| 數(shù)據(jù)類型 | 存儲(chǔ)位數(shù) | 數(shù)據(jù)范圍 |
| tinyint | 1 | 有符號(hào): -128–127? 無符號(hào): 0–255 |
| smallint | 2 | 有符號(hào):--32768–32767 無符號(hào):0–65535 |
| mediumint | 3 | 有符號(hào):-8388608–8388607 無符號(hào):0–16777215 |
| int | 4 | 有符號(hào):-2147483648–2147483647 無符號(hào): 0–4294967295 |
| bigint | 8 | 有符號(hào): -2^63?- 2^63-1 無符號(hào): 0–2^64-1 |
| decimal(M, N) | 1–29 | M 1到65 N 0到38,M大于等于N |
| float | 4 | 總位數(shù)65(其中小數(shù)部分38) |
| double | 8 | 總位數(shù)65(其中小數(shù)部分38) |
| bit(M) | 1-8 | 1-64 bits |
decimal的說明
1 decimal(5,2) 即小數(shù)點(diǎn)后面是2位,總5位(整數(shù)部分3位),所以范圍是-999.99-999.99。
2 ?decimal(m) 等價(jià)于decimal(m,0),即不含小數(shù)點(diǎn)部分。而decimal,即不指定精度時(shí)對(duì)應(yīng)decimal(10,0)。
float double的說明
1 float可以指定存儲(chǔ)“精度”(不是數(shù)據(jù)范圍),形式為flaot(n),該精度n和影響其存儲(chǔ)。當(dāng)n在0和23之間則存儲(chǔ)時(shí)需要4個(gè)字節(jié),而24到53之間則需要8個(gè)字節(jié)。
2 float也可以指定數(shù)據(jù)精度,一般形式為flaot(M,D),M代表總數(shù)值的位數(shù),而D是小數(shù)點(diǎn)后的位數(shù),比如float(7,3)的數(shù)據(jù)范圍是-9999.999到9999.999。
3 當(dāng)float里指定了數(shù)據(jù)精度時(shí),插入的數(shù)據(jù)將按照指定的精度四舍五入。比如在2里精度下9999.99859插入時(shí)將是9999.999,而9999.99849則是9999.998。
4 因?yàn)閒loat和double存的是近似數(shù),所以在做比較運(yùn)算時(shí)可能會(huì)有問題。
bit的說明
1 bit類型是用來存二進(jìn)制類型,它的一般形式是bit(M),其中M的范圍是1到64。
比如b'111'?and?b'10000000' 分別對(duì)應(yīng)十進(jìn)制的7和128。
2 添加到bit類型里的數(shù)據(jù)如果位數(shù)小于指定的M,則左邊自動(dòng)補(bǔ)0。比如將b'101'?添加到列BIT(6)里時(shí)等價(jià)于b'000101'。
3 bit類型不指定精度時(shí)默認(rèn)是1。
?代碼驗(yàn)證
浮點(diǎn)型
DROP TABLE tb_fixpoint CREATE TABLE tb_fixpoint (id int auto_increment, decimal_1 decimal, primary key(id) )-- 查看創(chuàng)建腳本 show create table tb_fixpoint; CREATE TABLE `tb_fixpoint` (`id` int(11) NOT NULL AUTO_INCREMENT,`decimal_1` decimal(10,0) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3# 1 插入最多10位的整數(shù) INSERT INTO tb_fixpoint VALUES(1,9999999999) > Affected rows: 1 > 時(shí)間: 0.324s# 2 插入11位以上數(shù)報(bào)錯(cuò) INSERT INTO tb_fixpoint VALUES(2,10000000000) > 1264 - Out of range value for column 'decimal_1' at row 1 > 時(shí)間: 0.001s # 3 插入含小數(shù)點(diǎn)的數(shù)不報(bào)錯(cuò),但實(shí)際截取小數(shù)點(diǎn)后的數(shù) INSERT INTO tb_fixpoint VALUES(2,9999999999.2987)SELECT * FROM tb_fixpoint2 反例驗(yàn)證decimal范圍 #2.1 總位數(shù)最多65位 ALTER TABLE tb_fixpoint ADD decimal_2 decimal(66,29) > 1426 - Too big precision 66 specified for 'decimal_2'. Maximum is 65 > 時(shí)間: 0s#2.2 小數(shù)點(diǎn)最多38位 ALTER TABLE tb_fixpoint ADD decimal_2 decimal(65,39) > 1425 - Too big scale 39 specified for 'decimal_2'. Maximum is 38 > 時(shí)間: 0s #2.3 總位數(shù)65,小數(shù)點(diǎn)后最多38位。 ALTER TABLE tb_fixpoint ADD decimal_2 decimal(65,38) > OK > 時(shí)間: 0.47s--#2.4 填充整數(shù)部分 UPDATE tb_datatype SET decimalcol= REPEAT(9,27) WHERE id = 1--#2.5 填充整數(shù)小數(shù)部分 UPDATE tb_datatype SET decimalcol= CONCAT(REPEAT(9,27),'.',REPEAT(9,38)) WHERE id = 1# 如果定義float(7,4)則存的范圍是-9999.999到9999.999 UPDATE tb_fixpoint SET float_3=9999.999 WHERE id = 1; UPDATE tb_fixpoint SET float_3=-9999.999 WHERE id = 2;# 會(huì)按照四舍五入方式截?cái)鄶?shù)據(jù) UPDATE tb_fixpoint SET float_3=9999.99859 WHERE id = 2; UPDATE tb_fixpoint SET float_3=9999.99849 WHERE id = 2; -- 結(jié)果 9999.999 9999.998bit型
# 新增bit類型 ALTER TABLE tb_fixpoint ADD bit_1 bit; UPDATE tb_fixpoint SET bit_1=b'01' WHERE id = 1; UPDATE tb_fixpoint SET bit_1=B'0' WHERE id = 2; #這里不能寫成0B,必須是小寫的b。 UPDATE tb_fixpoint SET bit_1=0b01 WHERE id = 2; #二進(jìn)制數(shù)據(jù)只有0和1,2及其它數(shù)字都是錯(cuò)誤輸入。 UPDATE tb_fixpoint SET bit_1=b'02' WHERE id = 1; > 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'b'02' WHERE id = 1' at line 1 > 時(shí)間: 0s # 超出bit的范圍 ALTER TABLE tb_fixpoint ADD bit_2 bit(65) > 1439 - Display width out of range for 'bit_2' (max = 64) > 時(shí)間: 0s# 超出bit的范圍,精度只到64. ALTER TABLE tb_fixpoint ADD bit_2 bit(64) > OK > 時(shí)間: 0.692s#插入65位二進(jìn)制數(shù)據(jù)。 UPDATE tb_fixpoint SET bit_2=b'11111111111111111111111111111111111111111111111111111111111111110' WHERE id = 1 > 1264 - Out of range value for column 'bit_2' at row 1 > 時(shí)間: 0.001s#插入64位二進(jìn)制數(shù)據(jù)。 UPDATE tb_fixpoint SET bit_2=b'1111111111111111111111111111111111111111111111111111111111111111' WHERE id = 2 > Affected rows: 1 > 時(shí)間: 0.065s#查看二進(jìn)制數(shù)據(jù)及其字符編碼 SELECT b'1000011', CHARSET(b'1000011'); 結(jié)果為:C#二進(jìn)制數(shù)據(jù)結(jié)合字符集查看數(shù)據(jù) SELECT _latin1 b'1000011'; SELECT _utf8 0b1000011 COLLATE utf8_danish_ci;結(jié)果都是 C完整腳本
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;-- ---------------------------- -- Table structure for tb_fixpoint -- ---------------------------- DROP TABLE IF EXISTS `tb_fixpoint`; CREATE TABLE `tb_fixpoint` (`id` int(11) NOT NULL AUTO_INCREMENT,`decimal_1` decimal(10, 0) NULL DEFAULT NULL,`decimal_2` decimal(65, 38) NULL DEFAULT NULL,`float_1` float NULL DEFAULT NULL,`float_2` float NULL DEFAULT NULL,`float_3` float(7, 3) NULL DEFAULT NULL,`bit_1` bit(1) NULL DEFAULT NULL,`bit_2` bit(64) NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;-- ---------------------------- -- Records of tb_fixpoint -- ---------------------------- INSERT INTO `tb_fixpoint` VALUES (1, 9999999999, NULL, NULL, NULL, 9999.999, b'1', NULL); INSERT INTO `tb_fixpoint` VALUES (2, 9999999999, NULL, NULL, NULL, 9999.998, b'1', b'1111111111111111111111111111111111111111111111111111111111111111');SET FOREIGN_KEY_CHECKS = 1;總結(jié)
以上是生活随笔為你收集整理的Mysql数据类型之浮点与二进制型数据使用案例总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql数据类型之整数型的一些细节你g
- 下一篇: Mysql数据类型之字符串的案例介绍(含