由于历史原因,数据库里的 age (即年龄) 用 char(1)来储存。
但是,如果用户信息中年龄大于9,即10岁以上的,我用
select age from userinfo limit 5;的结果是
2
2
3
1
2
都是只读到了首位。有没有办法读全?我用 cast(age as UNSIGNED) 不行。。求高手。

解决方案 »

  1.   

    CHAR(1)你是怎么把大于10的数据输进去的
      

  2.   

    我是用普通的insert语句的。
    尽管是char(1)类型,但是插入大于10的数据还是没问题的。可能有warning.
    类似的 int(1) 也可以插入大于10的数据。
      

  3.   

    char(1) 会自动截取首位。当你 insert ... value ('23') 的时候,数据库只存储了这个 '2'
    而 int(1) 则不同, int(1) 是存储4个字节,只不过是默认显示为1位。
      

  4.   

    MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html11.2. 数值类型...
    MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。当结合可选扩展属性ZEROFILL使用时, 默认补充的空格用零代替。例如,对于声明为INT(5) ZEROFILL的列,值4检索为00004。请注意如果在整数列保存超过显示宽度的一个值,当MySQL为复杂联接生成临时表时会遇到问题,因为在这些情况下MySQL相信数据适合原列宽度。
      

  5.   

    如果不能修改字段类型的话,我建议你存字符!
    比如一个人是97岁,你就存'a'进去啊。
    select ascii(’a‘) ;
    结果是97.
    但是还是建议修改该字段类型了。
      

  6.   

    满满好一个tinyint字段,硬要搞成char,为什么?
      

  7.   

    哈哈,改了吧。TINYINT比CHAR(1)占用空间还小。