MySQL數值型別在binlog中需要注意的細節(r12筆記第69天)
MySQL裡的數值型別分得很細,光整型資料就有多種資料型別。tinyint,smallint,mediumint,int(integer),還有範圍最大的bigint,它們對應的數值範圍也大大不同,大體來說就是下面的數值範圍,從有符號數和無符號數來區別對待。
型別名稱 | 有符號數(signed) | 無符號數(Unsigned) |
tinyint | -129~127 | 0~255 |
smallint | -32768~32767 | 0~65535 |
mediumint | -8388608~8388607 | 0~16777215 |
int(integer) | -2147483648~2147483647 | 0~4294967295 |
bigint |
-9223372036854775808~ 9223372036854775807 |
0~18446744073709551615 |
這一點上Oracle做得很大氣,直接一個number型別,精度也包了,兩者在這個地方風格截然不同。
對於MySQL的資料型別,我們來說說bigint,如果按照無符號數,最大的值為18446744073709551615,這是一個相當大的數字,如果從有符號資料的角度來看就是-1,那麼問題來了,在MySQL的binlog裡面是否會區分signed還是unsigned呢,如果不區分,這類問題該怎麼應對。
我做了如下的測試,使用conv來做進位制轉換。
> select conv(-1,10,2);
+------------------------------------------------------------------+
| conv(-1,10,2) |
+------------------------------------------------------------------+
| 1111111111111111111111111111111111111111111111111111111111111111 |
+------------------------------------------------------------------+
> select conv(18446744073709551615,10,2);
+------------------------------------------------------------------+
| conv(18446744073709551615,10,2) |
+------------------------------------------------------------------+
| 1111111111111111111111111111111111111111111111111111111111111111 |
+------------------------------------------------------------------+從機制轉換的結果來看,兩者是沒有差別的,如果是實際的場景中,這可是天壤之別。
我們換一個角度來轉換一下。
> select conv(repeat(1,64),2,-10);
+--------------------------+
| conv(repeat(1,64),2,-10) |
+--------------------------+
| -1 |
+--------------------------+
> select conv(repeat(1,64),2,10);
+-------------------------+
| conv(repeat(1,64),2,10) |
+-------------------------+
| 18446744073709551615 |
+-------------------------+這麼看來,讓人有些擔憂,如果達到這種資料的臨界點,會發生什麼意料之外的結果呢。
我們來建立一個表,指定兩個欄位,一個為有符號型別,一個為無符號型別,然後對應的數字,從binlog來看看解析出來的結果。
create table t1 (id int unsigned not null auto_increment primary key, col1 bigint unsigned, col2 bigint signed) engine=innodb;接著我們切一下日誌,檢視一下master對的狀態,得到日誌的偏移量和binlog名字。
> flush logs; show master status;
+---------------+----------+
| File | Position |
+---------------+----------+
| binlog.000031 | 107 |
+---------------+----------+這個時候我們插入兩列值,一個無符號,一個有符號。
insert into t1 (col1, col2) values (18446744073709551615, -1);然後使用flush logs再次切換日誌。
檢視資料的情況,可以從輸出看出兩者是有明顯的差別的。
> select * from t1;
+----+----------------------+------+
| id | col1 | col2 |
+----+----------------------+------+
| 1 | 18446744073709551615 | -1 |
+----+----------------------+------+我們從binlog來解析一下。
mysqlbinlog -vv binlog.000031
得到的部分日誌如下:
### INSERT INTO test.t1
### SET
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2=-1 (18446744073709551615) /* LONGINT meta=0 nullable=1 is_null=0 */
### @3=-1 (18446744073709551615) /* LONGINT meta=0 nullable=1 is_null=0 */
# at 268
#170519 18:54:47 server id 13386 end_log_pos 295 Xid = 76
COMMIT/*!*/;這樣看來對於binlog中,有符號數和無符號數都會按照無符號數來轉換,當然直接看資料型別是沒有標識有符號和無符號的差別的。所以如果是單純要解析binlog處理資料就需要考慮到這個地方的差別,對此一種思路是檢視information_schema中的列資訊來做出更加明確的判斷。
參考資料:https://mariadb.com/resources/blog/sign-row-based-binary-logging-and-integer-signedness-mysql-and-mariadb
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2139622/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MYSQL索引建立需要注意以下幾點細節MySql索引
- 數字展廳設計需要注意哪些細節?
- 使用JavaScript變數需要注意哪些語法細節?JavaScript變數
- 第 5 小節 golang 變數型別Golang變數型別
- 第 70 期 Go 中不常注意的各種細節集錦Go
- MySQL資料型別筆記MySql資料型別筆記
- 關於使用vector時需要注意的細節
- [python學習手冊-筆記]003.數值型別Python筆記型別
- 結構struct(值型別)在實際應用中應該注意的點Struct型別
- MySQL 數值型別溢位處理MySql型別
- mysql中數值型資料有哪兩個類別?MySql
- 電商選品需要注意的8個細節
- mysql 字串型別的數值欄位按照數值的大小進行排序MySql字串型別排序
- C#學習筆記之值型別與引用型別C#筆記型別
- MySQL8 JSON型別使用筆記MySqlJSON型別筆記
- 搭建直播系統前需要注意的細節有哪些?
- 第63節:Java中的Spring MVC簡介筆記JavaSpringMVC筆記
- Python工作筆記-往dll中傳入char*型別的引數並且如何接收char*的值Python筆記型別
- 高效能Mysql(第3版)_資料型別的選擇_整數型別MySql資料型別
- C#引用型別和值型別在堆、棧中的儲存C#型別
- MySql資料庫 數值型別的顯示寬度MySql資料庫型別
- MYSQL學習筆記15: 數值函式MySql筆記函式
- 十一:引數binlog_row_image(筆記)筆記
- TypeScript 數值型別TypeScript型別
- Python數值型別Python型別
- 直播系統開發中選擇伺服器需要注意哪些細節伺服器
- 3.帶你掌握Dart中的數值型別Dart型別
- 多型中的返回值型別多型型別
- 第 10 節:複合型別 2: 切片型別
- 第 4 節:基礎資料型別資料型別
- JavaScript - 變數、值、型別JavaScript變數型別
- 《高效能MySQL》筆記——MySQL建表資料型別的選擇MySql筆記資料型別
- 資料庫篇:mysql日誌型別之 redo、undo、binlog資料庫MySql型別
- 譯-MYSQL5.7參考手冊--數值型別概述MySql型別
- 記一次關於js陣列型別判斷及js型別判斷的細節探索JS陣列型別
- 這些Java程式碼最佳化細節,你需要注意!Java
- 【筆記】VS2017中出現 "const char *" 型別的值不能用於初始化 "char *" 型別的實體筆記型別
- JavaScript學習筆記 - 值的型別的一些知識點JavaScript筆記型別
- Golang陣列注意細節Golang陣列