技术开发 频道

MYSQL 数据类型存储-数值型

  4.2.1.4 负数,不带小数, DECIMAL(N)

  0)以0开头

  1)去掉第一位符号位,

  2)将剩余的数取反+1

  3)按二进制向十进制转换即可读到原值

  4.2.1.5 超长数值,如何读取

  当需要表示的数值超过某个限值后,如果你按以上的方法去读取数据,会发现读出来的数值是不对的.

  资料写道:

  ********************************************************************

  high byte first, four-byte chunks.

  We call the four-byte chunks "*decimal* digits".

  Since 2**32 = There is an implied decimal point. Details are in /strings/decimal.c.

  Example: a MySQL 5.0 DECIMAL(21,9) column containing 111222333444.555666777

  looks like: hexadecimal 80 6f 0d 40 8a 04 21 1e cd 59 -- (flag + '111', '222333444', '555666777').

  ********************************************************************

  但经过测试, 似乎是当数值<=999999999 时,我们还可以用原来的方法去读取.

  一旦数值>999999999,我们就需要按CHUNK(4个字节)来读取.

  详见4.2章节中的测试实例.

  4.2.2 实例验证

  4.2.2.1 带符号位的DECIMAL(M,N).

  Drop table if exists heyf ;

  create table heyf (id DECIMAL(4,2) ) type myisam ;

  insert into heyf values (65),(-65),(23.34),(-23.34);

  system hexdump /opt/mysql/data/test/heyf.MYD

  ----------------------------------------------

  0000000 c1fd 0000 0000 fd00 ff3e 0000 0000 97fd

  0000010 0022 0000 fd00 dd68 0000 0000

  ----------------------------------------------

  ROW1: c1 00 00 00 : 1 1000001 00000000 00000000 00000000

  ROW2: 3e ff 00 00 : 0 0111100 ffffffff 00000000 00000000

  ROW3: 97 22 00 00 : 1 0010111 00100010 00000000 00000000

  ROW4: 68 dd 00 00 : 0 1101000 11011101 00000000 00000000

  ------------------------------------------------------------

  磁盘数据 符号 整数 小数 空闲 空闲

  我们来看上面的方法进行读取:

  ROW1:

  符号位 : 1,正数.

  整数部分: 1000001 = 65

  小数部分: 0

  原值 : 65

  ROW2:

  符号位 : 0,负数

  取反+1 : 1000100 00000000

  整数部分: 1000001 = 65

  小数部分: 0

  原值 : -65

  ROW3:

  符号位 : 1,正数

  整数部分: 0010111 = 23

  小数部分: 00100010 = 34

  原值 : 23.34

  ROW4:

  符号位 : 0,负数

  取反+1 : 0010111 00100010

  整数部分: 0010111 = 23

  小数部分: 00100010 = 34

  原值 : -23,34

0
相关文章