V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
hobbyliu
V2EX  ›  MySQL

mysql 设置字段长度为啥 一般是 4 的倍数?

  •  
  •   hobbyliu · 2015-05-04 10:32:13 +08:00 · 7819 次点击
    这是一个创建于 3278 天前的主题,其中的信息可能已经有所发展或是发生改变。

    mysql 设置字段长度为啥 一般是4的倍数?
    比如 int(4) 而不是 int(3)

    34 条回复    2015-05-24 11:08:25 +08:00
    msg7086
        1
    msg7086  
       2015-05-04 10:40:44 +08:00
    我倒是很少见到有int(4)的。
    laoyuan
        2
    laoyuan  
       2015-05-04 10:46:54 +08:00
    谁能告诉我int(4) 和 int(3) 有什么区别?
    JayFang1993
        3
    JayFang1993  
       2015-05-04 10:48:48 +08:00
    我操,我是根据头像来的
    yangqi
        4
    yangqi  
       2015-05-04 10:51:06 +08:00   ❤️ 1
    int(3)和int(4)所占用的空间都是一样的,3和4是只是限制显示的位数
    wy315700
        5
    wy315700  
       2015-05-04 10:53:53 +08:00
    4楼正解,,,
    hobbyliu
        6
    hobbyliu  
    OP
       2015-05-04 10:55:38 +08:00
    @yangqi 那int(11) 设定是否合理?
    ksupertu
        7
    ksupertu  
       2015-05-04 10:57:14 +08:00
    楼主需要补计算机基础原理《深入理解计算机系统》 关键字 二进制
    hobbyliu
        8
    hobbyliu  
    OP
       2015-05-04 11:04:19 +08:00
    @ksupertu 额 我会好好看的 不是科班出身的说。。
    wy315700
        9
    wy315700  
       2015-05-04 11:09:25 +08:00
    @hobbyliu int(11) 后面的11 不是二进制位数,是最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关;
    perssy
        10
    perssy  
       2015-05-04 12:06:51 +08:00   ❤️ 1
    显示宽度是最小宽度,不限制最大宽度,若设置了zerofill值则左边用0填充。 https://dev.mysql.com/doc/refman/4.1/en/numeric-type-attributes.html
    另外,根据 http://stackoverflow.com/questions/5634104/what-is-the-size-of-column-of-int11-in-mysql-in-bytes ,显示宽度只在mysql的命令行中有效
    wuyadong
        11
    wuyadong  
       2015-05-04 12:53:07 +08:00
    这和计算机的存储结构有关,建议楼主阅读,计算机组成原理 相关书籍。
    b821025551b
        12
    b821025551b  
       2015-05-04 12:56:15 +08:00
    int设置的长度只是显示的补位长度,char设置的长度才是存储空间上的长度
    jhdxr
        13
    jhdxr  
       2015-05-04 14:26:12 +08:00
    不问是不是就先问为什么的都是耍流氓。。。

    另外 @ksupertu , @wuyadong 这和储存结构有毛关系。这值不管设置多少,储存范围都那么大。莫装B。。。
    cover
        14
    cover  
       2015-05-04 14:52:42 +08:00
    int(4) 应该表示的 是 10进制下的 位数把。。。所以进经常用的应该是 int(11)正好 32位(二进制)把。。。。 当然也可能 int(4)正好是 8位啊 16位啊 总之要变成2进制的
    ksupertu
        15
    ksupertu  
       2015-05-04 14:59:09 +08:00
    @jhdxr 请问,让人看基础课本,哪里装B了?那我也问你,为什么是四的倍数?你设置成4的倍数是否潜意识里受到了职业习惯的影响?引申发问,硬盘为什么要4K对齐?操作系统为什么是32位64位这样4的倍数?写个关键字 二进制,你就脑补成那个int后面位数是二进制了?我们谈论的是一个东西?
    cover
        16
    cover  
       2015-05-04 15:11:10 +08:00
    @ksupertu 其实我觉得让人看课本没问题,不过回答问题的方式 应该是“ 首先这个问题其实很简单,应该这样这样解释,其次楼主可以去补一下xx课程,xx书 对楼主遇到这方面问题的时候会很有帮助”
    这样会不会好一点呢。。。
    yxqcyl
        17
    yxqcyl  
       2015-05-04 15:17:36 +08:00
    为什么我想到了王思聪?
    b821025551b
        18
    b821025551b  
       2015-05-04 15:19:39 +08:00
    @cover 不是,int(4)里的4就是补位数,和存储没关系。
    cover
        19
    cover  
       2015-05-04 15:29:37 +08:00
    @b821025551b 刚刚查了下 是这样的。。孤陋寡闻了 一直不知道 其实括弧里面的数也没啥用咯
    wuyadong
        20
    wuyadong  
       2015-05-04 15:31:40 +08:00
    @jhdxr ...这有装逼么? 题主问得什么是4的倍数,这个数字问什么这么特别,这不是和计算机体系结构里的知识有关么,我只是非常诚恳的告诉楼主哪里可以知道答案....ps:如果想装逼应该就会回答,mysql的源码什么滴...........
    iyaozhen
        21
    iyaozhen  
       2015-05-04 15:35:41 +08:00
    int 还要设置值吗?直接 int(11),设置啥都一样。
    cmingxu
        22
    cmingxu  
       2015-05-04 16:33:47 +08:00
    int(11)这玩意实在容易迷惑人, 这东西就是给client用的, 告诉client该用多宽来显示字段里面内容的。
    imn1
        23
    imn1  
       2015-05-04 16:54:49 +08:00
    4*8=32 bits
    lito
        24
    lito  
       2015-05-04 17:07:39 +08:00
    @JayFang1993 我也是!
    hobbyliu
        25
    hobbyliu  
    OP
       2015-05-04 17:22:16 +08:00
    @cmingxu 但是如果 我 设置 int(1) 要 insert 9999 进入,貌似报错,按道理 1 只是显示,和存储无关 应该能存进去啊
    elvba
        26
    elvba  
       2015-05-04 17:42:15 +08:00
    @perssy 这才是整个楼层中的最全面的正解。
    elvba
        27
    elvba  
       2015-05-04 17:45:02 +08:00
    @hobbyliu 确定 sql 语句没错? 设置 int(1), 99999999 都能存进去。
    hobbyliu
        28
    hobbyliu  
    OP
       2015-05-04 18:01:19 +08:00
    @elvba 嗯 确实如此,也能塞进去。那么问题来了 int(x) 这个 x 可以影响什么,能否举例说明?
    elvba
        29
    elvba  
       2015-05-04 18:21:21 +08:00
    @hobbyliu 10楼的解释很全面了,对于 int 型,这个 x 只有你在设置了零填充,并且只有使用 mysql 命令行工具时,才会有用,也就是说……这个东西并没有什么用嘛,无视掉都可以。
    kchum
        30
    kchum  
       2015-05-04 18:44:59 +08:00 via iPhone
    10# 正解
    29# 更让人明白…
    hobbyliu
        31
    hobbyliu  
    OP
       2015-05-04 19:11:51 +08:00
    @elvba 哪 varchar(x) 呢?
    lostarray
        32
    lostarray  
       2015-05-04 22:58:23 +08:00
    @hobbyliu 这个就是真的设置最大长度了
    thinkmore
        33
    thinkmore  
       2015-05-05 09:59:45 +08:00
    限制位数而已,我还用int(10)呢
    mingyun
        34
    mingyun  
       2015-05-24 11:08:25 +08:00
    亲测,int(2) 也能插入12344,看来没什么用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3474 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:55 · PVG 12:55 · LAX 21:55 · JFK 00:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.