oracle NUMBER(22)和mysql bigint(22)字段类型问题.

ImFantasy 2011-02-15 11:29:07



这张图片是淘宝API技术支持人员给提供的淘宝数据结构的截图, 这个是他们的订单ID字段的类型. 他们应该是oracle的.

NUMBER类型 长度是22 但是实际上订单id长度目前在14位,

对应他这个订单ID字段, 我在mysql里面用bigint(22) 类型和长度来做ID的存储 有问题吗?

有经验的童鞋们 帮忙分析一下.

...全文
2852 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
aleng18 2011-02-18
  • 打赏
  • 举报
回复
BIGINT(size) 8=±19d
FLOAT(size,d) 4=±38d.±7d
DOUBLE(size,d) 8=±308d.±15d
DECIMAL(size,d) ±65d.±30d
iihero_ 2011-02-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 imfantasy 的回复:]

Decimal的效率是不是跟int类型的差不多呀?

引用 10 楼 iihero 的回复:

为什么不用Decimal(22,0)来描述呢?不要使用varchar。
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]


For MySQL 5.0.3 and above:

A packed ``exact'' fixed-point numbe……
[/Quote]
decimal效率应该比int略低,但是肯定比varchar(N)高。
iihero_ 2011-02-16
  • 打赏
  • 举报
回复
为什么不用Decimal(22,0)来描述呢?不要使用varchar。
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]


For MySQL 5.0.3 and above:

A packed ``exact'' fixed-point number. M is the total number of digits and D is the number of decimals. The decimal point and (for negative numbers) the '-' sign are not counted in M. If D is 0, values have no decimal point or fractional part. The maximum number of digits (M) for DECIMAL is 64. The maximum number of supported decimals (D) is 30. If UNSIGNED is specified, negative values are disallowed.

If D is omitted, the default is 0. If M is omitted, the default is 10.

All basic calculations (+, -, *, /) with DECIMAL columns are done with a precision of 64 decimal digits.

ldb2741 2011-02-16
  • 打赏
  • 举报
回复
你又想用int类型,又想要22位的,但是mysql bigint 也没那么长的
你还是用varchar 的
ImFantasy 2011-02-16
  • 打赏
  • 举报
回复
感谢大家的回答,

回复 ACMAIN_CHM大哥,你这个问题我回答不了, ID不是我来自增的,是淘宝数据库的,我们通过API获取,这个字段我们不会设置自增, 只是仅仅用来存ID,然后索引.

至于什么时候会涨到 18446744073709551615 , 那我真不知道,反正淘宝那边的技术支持跟我说他们的oracle是留的22位来存,目前是涨到14位(貌似以前没有14位),然后就推荐我跟着他们的数据结构一样来做,避免日后订单系统存不进去淘宝的交易ID.

所以我来CSDN问问ACMAIN_CHM大哥 mysql里面INT类型的 最大的有没有22位的, 如果只有bigint 20位的话, 短时间应该没问题, 我怕马总那天一下升级到21位,我就装不进去ID了.


================================================================================

回复feixianxxx 大哥:

提早用22位, 请问mysql里面如何用22位的int呢? 我目前还不知道.

[Quote=引用 6 楼 feixianxxx 的回复:]

1.number(22) 括号里面的数字表示你精度,这个时候你可以存储22精度以下的任何数字...
所以如果业务能涨到那个份上 就提早用22好了

2.困难,一旦数据量变大后,修改表结构是很吃力的事情。一般可以重新构造相同表结构表,然后导出数据到新表。然后删除原表,然后重命名新表为原表名...
对数据有影响否看你怎么改?
比如一个字符串,如果你本来是varchar(50) ……
[/Quote]



[Quote=引用 7 楼 acmain_chm 的回复:]

MYSQL中BIGINT最大可以支持到 18446744073709551615
楼主可以计算一下你的系统什么时候会涨到这个数字,给个大概的时间长度?估计一下多少天。
[/Quote]
ImFantasy 2011-02-16
  • 打赏
  • 举报
回复
Decimal的效率是不是跟int类型的差不多呀?

[Quote=引用 10 楼 iihero 的回复:]

为什么不用Decimal(22,0)来描述呢?不要使用varchar。
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]


For MySQL 5.0.3 and above:

A packed ``exact'' fixed-point number. M is the total number of digits and D is the nu……
[/Quote]
feixianxxx 2011-02-16
  • 打赏
  • 举报
回复
oracle的number有精度的啊...存储容量
跟你说的int还是不一样的...int容量固定
ACMAIN_CHM 2011-02-15
  • 打赏
  • 举报
回复
楼主的顾虑是什么? BIGINT的最大范围是多少?楼主有没有了解一下? 你担心什么样的问题?

严格的来说,BIGINT无法支持到22位,最多无符号也就20位。

[Quote=MySQL 5.4 Reference Manual]
BIGINT[(M)] [UNSIGNED] [ZEROFILL]

A large integer. The signed range is -9223372036854775808 to 9223372036854775807. The unsigned range is 0 to 18446744073709551615.


[/Quote]
ACMAIN_CHM 2011-02-15
  • 打赏
  • 举报
回复
MYSQL中BIGINT最大可以支持到 18446744073709551615
楼主可以计算一下你的系统什么时候会涨到这个数字,给个大概的时间长度?估计一下多少天。
feixianxxx 2011-02-15
  • 打赏
  • 举报
回复
1.number(22) 括号里面的数字表示你精度,这个时候你可以存储22精度以下的任何数字...
所以如果业务能涨到那个份上 就提早用22好了

2.困难,一旦数据量变大后,修改表结构是很吃力的事情。一般可以重新构造相同表结构表,然后导出数据到新表。然后删除原表,然后重命名新表为原表名...
对数据有影响否看你怎么改?
比如一个字符串,如果你本来是varchar(50) 后来你改小了,变成40 可能会丢失...
ImFantasy 2011-02-15
  • 打赏
  • 举报
回复
现在的问题有:
1,mysql里面用什么类型的字段来保存一个可能会变化长度 (变化的周期很长,很有可能14位的要用3年,然后升到15位,再升到16这样子,一直到20多位)的ID呢? 淘宝数据库现在是14位,他的oracle给的是number(22)

2,后期如果我改变这个字段的数据类型,困难吗?会不会对数据造成影响?


[Quote=引用 1 楼 acmain_chm 的回复:]

楼主的顾虑是什么? BIGINT的最大范围是多少?楼主有没有了解一下? 你担心什么样的问题?

严格的来说,BIGINT无法支持到22位,最多无符号也就20位。

MySQL 5.4 Reference Manual
BIGINT[(M)] [UNSIGNED] [ZEROFILL]

A large integer. The signed range is -9223372036……
[/Quote]
ImFantasy 2011-02-15
  • 打赏
  • 举报
回复
效率跟int不是一个档次
[Quote=引用 3 楼 mr_mablevi 的回复:]

直接用varchar 好了,
[/Quote]
小小小小周 2011-02-15
  • 打赏
  • 举报
回复
直接用varchar 好了,
ImFantasy 2011-02-15
  • 打赏
  • 举报
回复
是这样的, 淘宝给过来的数据 根据时间的问题 有可能是14位的id 有可能长到22位, 都是数字的
在mysql里面我应该用什么样的数据字段来做这个呢?

[Quote=引用 1 楼 acmain_chm 的回复:]

楼主的顾虑是什么? BIGINT的最大范围是多少?楼主有没有了解一下? 你担心什么样的问题?

严格的来说,BIGINT无法支持到22位,最多无符号也就20位。

MySQL 5.4 Reference Manual
BIGINT[(M)] [UNSIGNED] [ZEROFILL]

A large integer. The signed range is -9223372036……
[/Quote]

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧