mysql儲存資料,varchar型別中的資料變成了科學計數法?
文章目錄
一、前言
這個問題也是比較奇怪的,明明設定的是varchar
型別,但儲存的結果卻是科學計數法,這還了得,必須找一下原因了
1、表現形式
[uuid] => 1460444056320623751784
[log_time] => 2016-05-30 01:03:01
[daily_nums] => 1.125899906842624e15
就是這個daily_nums
欄位,十分的奇怪。
2、出現錯誤的sql
update test set daily_nums_nums =pow(2,x) where 1 ;
此處的pow
函式是求冪次方的,博主這裡是求2的n
次方。,對了,mysql
版本是5.7
二、問題排查
1、資料表結構
$sql = "CREATE TEMPORARY TABLE if not exists test (
uuid varchar(32) NOT NULL PRIMARY KEY,
`log_time` datetime NOT NULL ,
`daily_nums` VARCHAR(100) NOT NULL DEFAULT '0',
UNIQUE KEY `uuid` (`uuid`),
KEY (log_time)
) DEFAULT CHARSET utf8 COLLATE utf8_general_ci";
這裡給出的是varchar(100)
型別,沒道理存不下小小十幾位的資料才對,怪哉怪哉
2、錯誤推測
明明是varchar
結果,為什麼反而成大數了了呢,推測是兩個可能
(1)資料庫讀出來是科學計數法
(2)資料庫裡面儲存的就是科學計數法
答案是第二種
3、最終原因
此處應該是由於pow()
這個函式的原因導致的,當2^50
的時候,已經達到了15
位,當51
次方的時候,超過了15
位,就記成了科學技術法
2^ 50 = 562949953421312
2^ 51 = 1.125899906842624e15
猜測也是有內部的資料結構導致的,類似於浮點型的精度問題,但是沒找到具體的答案,這裡不再深究。
參考php
的14
位大數轉化為科學計數法:php使用位運算來實現日留存的演算法
三、解決方案
1、更改資料結構
更改欄位為bigint
即可,下面可以測試下,當插入科學計數法的時候,bigint
和varchar
的區別:
(1)表結構
CREATE TABLE `temp_drr_test` (
`uuid` varchar(32) NOT NULL,
`daily_nums` bigint(20) NOT NULL DEFAULT '0',
`weekly_nums` bigint(20) NOT NULL DEFAULT '0',
`monthly_nums` bigint(20) NOT NULL DEFAULT '0',
`test_nums` varchar(100) DEFAULT '',
UNIQUE KEY `uuid` (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
daily_nums為bigint, test_nums為varchar
(2)分別更新兩個欄位為 科學計數法 :2.251799813685248e15
mysql> select * from temp_drr_test;
+------+---------------------+---------------------+--------------+---------------------+
| uuid | daily_nums | weekly_nums | monthly_nums | test_nums |
+------+---------------------+---------------------+--------------+---------------------+
| 1111 | 4611686018427387904 | 9223372036854775807 | 0 | 4611686018427387904 |
+------+---------------------+---------------------+--------------+---------------------+
1 row in set (0.00 sec)
mysql> update temp_drr_test set daily_nums=2.251799813685248e15;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from temp_drr_test;
+------+------------------+---------------------+--------------+---------------------+
| uuid | daily_nums | weekly_nums | monthly_nums | test_nums |
+------+------------------+---------------------+--------------+---------------------+
| 1111 | 2251799813685248 | 9223372036854775807 | 0 | 4611686018427387904 |
+------+------------------+---------------------+--------------+---------------------+
1 row in set (0.00 sec)
mysql> update temp_drr_test set test_nums=2.251799813685248e15;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from temp_drr_test;
+------+------------------+---------------------+--------------+----------------------+
| uuid | daily_nums | weekly_nums | monthly_nums | test_nums |
+------+------------------+---------------------+--------------+----------------------+
| 1111 | 2251799813685248 | 9223372036854775807 | 0 | 2.251799813685248e15 |
+------+------------------+---------------------+--------------+----------------------+
1 row in set (0.00 sec)
最終發現,當欄位為bigint
的時候,是可以自動調節為數字的。只不過bigint
能儲存的長度也有限,難保不會超過,所以用下一個方法
2、按位或上一個值
update test set daily_nums =pow(2,x) | 0
這裡選擇0
,這樣在保證值不變的情況下,也能正常儲存了,經測試無誤,可以儲存為大數。
end
相關文章
- MYSQL 資料型別儲存-數值型MySQL 資料型別
- MYSQL-資料型別儲存-DATEMySql資料型別
- MySQL資料型別操作(char與varchar)MySql資料型別
- JavaScript中的資料型別-儲存差別JavaScript資料型別
- MySQL字元資料型別char與varchar的區別MySql字元資料型別
- 【YashanDB知識庫】kettle從DM8的number型別同步到YashanDB的varchar型別,存入是科學計數法形式的資料型別
- MySQL CHAR和VARCHAR資料型別介紹MySql資料型別
- PLSQL Language Reference-PL/SQL資料型別-SQL資料型別-CHAR和VARCHAR2變數SQL資料型別變數
- 資料型別,變數資料型別變數
- js基本語法之 值型別(資料型別)(變數型別)JS資料型別變數
- SSIS 資料型別 第二篇:變數的資料型別資料型別變數
- 重新學習Mysql資料庫3:Mysql儲存引擎與資料儲存原理MySql資料庫儲存引擎
- redis-4.資料儲存型別Redis型別
- varchar型別的欄位儲存純數字的排序型別排序
- 【資料庫】資料庫儲存元素型別基礎資料庫型別
- 資料科學求職建議:掌握5種型別的資料科學專案資料科學求職型別
- JavaScript中的變數、資料型別以及運算子JavaScript變數資料型別
- Mysql 資料型別之整數型別MySQL 資料型別
- Oracle的資料型別:char/varchar2Oracle資料型別
- MySQL 常用資料儲存引擎區別MySql儲存引擎
- Mysql資料庫學習(二):資料型別(數值型別 日期和時間型別 字串型別)MySql資料庫資料型別字串
- 二、變數與資料型別變數資料型別
- double型別資料在記憶體中中儲存格式型別記憶體
- Oracle基本資料型別儲存格式淺析(二)——數字型別Oracle資料型別
- 服務端指南 資料儲存篇 | MySQL(01) 資料型別的使用與選擇服務端MySql資料型別
- PHP memcached 各種資料型別儲存PHP資料型別
- oracle資料型別與儲存結構Oracle資料型別
- 【MySQL資料型別1之--數值型別】MySql資料型別
- 分析 JavaScript 的資料型別與變數JavaScript資料型別變數
- JS的資料型別和變數(轉)JS資料型別變數
- 電腦科學概論(1)資料在計算機中的儲存和表示計算機
- MySQL 的資料型別MySql資料型別
- MySQL的資料型別MySql資料型別
- Oracle基本資料型別儲存格式淺析——RAW型別Oracle資料型別
- python—資料型別和變數Python資料型別變數
- Java檢視變數資料型別Java變數資料型別
- 保留資料庫表中的資料,把表中的欄位varchar2改成clob型別資料庫型別
- mysql變長型別欄位varchar值更新變長或變短底層檔案儲存原理MySql型別