MySQL中的char、varchar(10)、varchar(1000)的区别

tips

若无特殊指明,文中提到的存储空间指的都是占用磁盘空间

MySQL中的varchar与char的区别

存储空间
    char(m)是固定长度的字符串,始终会占用 M 个字符长度的空间,如果长度小于 M,MySQL会用空格补齐,但在检索时char类型末尾的空格会被忽略,无论是我们存入的,还是MySQL自己补齐的(这里是一个大坑)。
    varchar(m)是可变长度的字符串,m 为允许存入的最大长度——字符数,不会自动用空格补齐,而是采用额外的 1 ~ 2 个字节记录实际长度;当实际长度小于等于 255 时,额外占用 1 个字节去存储实际长度,大于 255 时,则额外使用 2 个字节。

更新时的额外操作
    char 类型是固定长度的,在更新时不会出现长度变化。但由于 varchar 的长度是可变的,在更新时长度很容易发生变化,这时就需要同时更新 varchar 的长度字节。如果原来的存储位置已经无法满足其存储的需求,此时系统就需要进行额外的操作。如根据存储引擎不同,有的会采用拆分机制,而有的则会采用分页机制。

空间碎片
    使用char字符型时,由于存储空间都是一次性分配的。为此某个字段的内容,其都是存储在一起的。单从这个角度来讲,其不存在碎片的困扰。
    可变长度的字符数据类型,其存储的长度是可变的。当其更改前后数据长度不一致、频繁删除时,就不可避免的会出现碎片的问题。故使用可变长度的字符型数据时,数据库管理员要时不时的对碎片进行整理。如执行 optimize table,来消除碎片。

varchar(100) 与varchar(1000)的区别

    很多人会认为既然 varchar 的空间是按实际使用为准,那么 varchar(100) 与 varchar(1000) 就是一样的了,直接将字段长度都设置的大一些就好了,一劳永逸,不用担心字段超长的问题。但其实不然,除了 varchar(100) 会额外占用 1 个字节存储实际长度,varchar(1000) 会占用 2 个字节以外,在内存操作和索引操作上也会有不同。
内存操作
    对于 varchar 数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是。其实使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即 1000 个字符空间。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响。
    假设 varchar(100) 与 varchar(1000) 类型,实际存90个字符,它不会对存储端产生影响(就是实际占用硬盘是一样的)。但是,它确实会对查询产生影响,因为当MySql创建临时表(SORT,ORDER等)时,varchar 会转换为 char,转换后的 char 的长度就是 varchar 的长度,在内存中的空间就变大了,在排序、统计时候需要扫描的就越多,时间就越久。
    所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配 varchar 数据类型时仍然不能够太过于慷慨。还是要评估实际需要的长度,然后选择一个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为其为根据实际长度来分配存储空间,而随意的分配长度,或者说干脆使用最大的字符长度。

索引角度
    MySQL建立索引时假设没有限制索引的大小,索引长度会默认采用的该字段的长度。也就是说 varchar(1000) 的索引比 varchar(100) 的大。

参考

1.实现OA事务提醒信息直接到RTX系统提醒。 2.RTX点击消息提醒“查看详情”直接打开OA相应界面。 3.集成安装主要在服务器端实施,客户端不需要安装插件、设置OA网站、登陆用户名、密码,基本零设置直接实现集成。 本帖修正本 《OA-RTX事务提醒集成插件(2011测试通过)》的所有问题,通达2013、RTX2012测试完美通过。解决的问题如下: 1. 修正 找不到“RTX事务提醒设置”的问题 2. 修正 错误#1136: Column count doesn't match value count at row 1 SQL语句: INSERT INTO `sys_function` VALUES ('1003', 'z0R2', 'RTX事务提醒设置', 'system/rtx_sms') 问题 3. 修正RTX 的OA面板出现“用户名及密码错误”的问题,很多人到现在都不能解决 一【统一用户名】 1.现将OA部门用户信息在通达oa2013里添加完毕)(用户名等信息等)。 2.通达oa系统管理-组织结构管理-用户管理:选择导出RTX格式。 3.打开腾讯通RTX管理器,导入用户信息(后期增加的用户oa及rtx两边个增加一次确保用户名一致即可)。 二【RTX修改】 1.RTXSERVER安装目录下找到AppConnConfig文件用记事本打开,加入OA服务器IP地址 2.运行RTX管理器,进入"系统工具"-"客户端面板定制",添加新面板,面板对应网址设置为 http://OA域名:端口/ispirit/rtx_sign.php?c5f6vCqiVY43be9LzdBuwiztGdtHrWh6S0P9vYt3Y74edjWrXlArQPCG8lrM3qQ 3.重启RTX所有服务 三【oa修改】 1..通达OA服务器设置:下载安装RTX2012SDK rtxserver2012formal.exe 到OA服务器. 2. OA目录下找到inc\utility_sms1.php,改名为utility_sms1_original.php 3. 下载本帖新的修正附件,解压缩覆盖webroot文件夹 4. 打开OA登陆界面,点击升级。 5. 管理员账号登陆OA,进入“系统设置”-“系统接口设置”,添加一个接口用户,插件默认接口用户设置为rtx/rtx,(可以自己设置) (*重要的一步) 6.重启通达oa通达应用服务控制中心“所有服务 (*重要一步) 7.进入“系统设置”-"RTX事务提醒设置" 设置好RTX服务器IP、 RTX服务器的IP地址等即可 6.重启通达oa通达应用服务控制中心“所有服务
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值