在做新浪微博(Sina Weibo)相关应用的过程中,遇到一个诡异现象:

  1.  IPhone手机端传送的新浪微博用户ID为2440218904,但是存入MySQL数据库之后,用户ID变为2147483647;

  2.  此数据回传手机端后,手机端获得的微博信息并非ID为2440218904的用户所发,而是名叫“微笑天使包燕娜”的用户的微博信息;

百思不得其解,在线Google之后发现一篇针对IPhone客户端的“微笑天使包燕娜”现象分析及解决方案(here)。仔细阅读之后发现,问题的关键点在于:INT类型最大值限制;

我们的系统设计之初,MySQL数据库就将新浪微博用户的ID存储为有符号INT类型了,而MySQL数据库有符号INT类型的最大值为2147483647。那么,凡是ID大于INT最大值的都被强制存储为INT类型最大值。

服务器端的解决办法就是:

方案一:将保存新浪微博用户ID的字段设置为BIGINT类型;

方案二:将保存新浪微博用户ID的字段设置为VARCHAR(255)类型;(此方案未经测试,谨慎使用!)

至此,服务器端关于“微笑天使包燕娜”的问题已完美解决。

补充更新:

2011-10-11:

  1. 新浪微博官方关于“微笑天使包燕娜”现象的解决方案:【公告】 微博平台微博id升级公告

  2. 其他开发者针对此问题的解决方案:php json_encode函数不支持BIGINT的问题(提醒:官方json中”id”和冒号之间有空格,作者的正则表达式缺少这个空格,不能用哟, :) )

2011-10-20:

  1. 新浪微博官方最近推出更加丰富的功能接口的同时,也对用户ID问题给出了更加直接的解决方案:增加idstr字段;

  2. 使用关键字 idstr site:open.weibo.com 进行搜索后发现,新浪微博官方在如下接口中添加了这一字段: