Mysql书库巨FT的一件事情

这个问题很有意思。

表结构
字段 类型 属性 Null 缺省值
xh decimal(20,0) 否 0
zid decimal(20,0) 否 0
czsj datetime 是 NULL
ip char(15) 是 NULL

执行下列语句
insert into tdljl (xh,zid,czsj,ip) values (20030725122135322311,1003,now(),'127.0.0.1')

结果为:
20030725122135323000 1003 2003-07-25 12:26:57 127.0.0.1

第一列xh 的值从20030725122135322311变成了20030725122135323000

但如果把SQL改成insert into tdljl (xh,zid,czsj,ip) values ('20030725122135322311',1003,now(),'127.0.0.1')
将xh作为一个字符串插入,数据库自动转换类型后结果就是正确的。

mysql对decimal的处理在超过一定长度后有特殊处理么?

试了一下,如果是19位长度的一个数字写进去的也是正确的。但只要是20位的值就变了。
mysql的解释

DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
一个未压缩(unpacked)的浮点数。运作如同一个 CHAR 列:“unpacked” 意味着数字是以一个字符串存储的,值的每一位将使用一个字符。小数点并且对于负数,“-” 符号不在 M 中计算(但是它们的空间是被保留的)。如果 D 是 0,值将没有小数点或小数部份。DECIMAL 值的最大范围与 DOUBLE 一致,但是对于一个给定的 DECIMAL 列,实际的范围可以被所选择的 M 和 D 限制。如果 UNSIGNED 被指定,负值是不允许的。 如果 D 被忽略,缺省为 0。如果 M 被忽略,缺省为 10。 在 MySQL 3.23 以前,M 参数必须包含符号与小数点所需的空间。

好像看不出什么东西