文档章节

认真对待数据库中char和varchar

白志华
 白志华
发布于 2015/10/18 10:56
字数 795
阅读 2
收藏 0
点赞 0
评论 0

       大家现在都在做或者做完了机房收费系统,其中创建数据库阶段,会涉及到数据类型的设置,大家都有所了解了,那么我们来讨论一下其中的Char和Varchar的区别吧。

 

先说一下它们的工作方式:

Char是固定长度的字符型,VarChar是可变长度的字符型。什么意思呢?我们举个例子。比如设定了2个字段:CardID char(6) ,StuID varchar(6)。当给这2个字段插入数据时:(这里用的是SQL Server 2005)

 

输入数据

char类型的字段内容

varchar类型的字段内容

aaa

aaa  
(aaa后面还有3个空格)

aaa
(aaa后面没有空格)

aaabbb

aaabbb

aaabbb

aaabbbccc

出错,将截断字符串或二进制数据

 出错,将截断字符串或二进制数据

 

       由上表可以看出,对于char类型的数据来说,如果添加的字符长度不够,SQL自动用空格补齐,而varchar则不会自动补空格。也就是说char类型的数据长度 = 定义的长度,而varchar类型的数据长度 <= 定义的最大长度。

 

       char类型,固定字长,效率高,但是会比varchar多占用空间;varchar类型,可变字长,节省空间,但是效率比char稍差。

 

       由于它们的特性,决定了它们的使用情况:

 

       char使用会比varchar多些。我们不是太缺空间,而且高效率会提高我们的产品的认可率。这就是数据库设计中常用到的“以空间换效率”。此外, varchar 虽然比char节省空间,但是如果一个varchar列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象(Oracle中较为明显),而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用char代替varchar效果会更好一些。

 

      但是用char时要时刻注意空格问题。由于char会自动补齐空格,所以在输入数据长度小于定义的最大长度时,输入"a" 和输入"a "是一样的。因为它们最终后面会补齐空格而变成相同的内容。假如该列有主键约束或者唯一性约束,那么就会发生错误,因为违反了“实体完整性”约束。当然如果没有这些约束,同样也会出现错误。就拿我们刚做的机房收费系统的登录模块来说吧,如果把密码定义成了char类型,那么把设定密码为“admin  ”,而我用“admin”可以顺利登录,这显然不是用户想看到的。追求效率是对的,但是前提是保证其正确性。所以我认为一些特定的必须要用varchar,比如密码。

 

       char与varchar其实是一对矛盾的统一体,两者是互补的关系。我们要认真对待,切实选择!

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
白志华
粉丝 29
博文 260
码字总数 57524
作品 0
长沙
程序员
跟王老师学MySQL:MySQL数据类型之字符类型

跟王老师学MySQL:MySQL数据类型之字符类型 主讲教师:王少华 QQ群号:483773664 学习内容: 字符串类型的种类及其特点 char和varchar的异同 字符串类型是在数据库中存储字符串的数据类型。 ...

imentors ⋅ 2016/07/04 ⋅ 0

MySQL的varchar定义长度到底是字节还是字符

相信这个问题也会困扰不少人,尤其是使用过其它数据库(如Oracle)的人,之前我也没有太在意这个问题,再加上一些书籍和网上的文章讲的不够细致,又没测试过,导致我一直理解错误。下面通过实例...

Airship ⋅ 2015/08/10 ⋅ 0

Oracle中char,varchar,varchar2,nvarchar,nvarchar2的区别

一、概述 1.char char的长度是固定的,比如说,你定义了char(20),即使你你插入abc,不足二十个字节,数据库也会在abc后面自动加上17个空格,以补足二十个字节; char是区分中英文的,中文在c...

MiniBu ⋅ 2014/06/23 ⋅ 0

关于数据库Varchar字段类型长度设计问题

现代数据库一般都支持CHAR与VARCHAR字符型字段类型,CHAR是用来保存定长字符,存储空间的大小为字段定义的长度,与实际字符长度无关,当输入的字符小于定义长度时最后会补上空格。VARCHAR是用...

GREKI ⋅ 2014/03/14 ⋅ 0

MySql中的varchar类型

MySql中的varchar类型(转) 今天新开始的项目在做数据库设计,发现自己对MySql的varchar类型还不熟悉,故又上网收集资料整理如下。 1.varchar类型的变化 MySQL 数据库的varchar类型在4.1以下...

馨缘6009 ⋅ 2013/12/12 ⋅ 0

SQL字段设计之char与varchar

mysql字段的char和varchar设计区别 sqllearn.png 1,设计背景 在进行交易日志表设计卡号,姓名,身份证,手机号时,在想为什么有的时候是字段类型为char,有的时候是varchar,而且设计的长度也...

剽悍一只鸡 ⋅ 2017/09/15 ⋅ 0

数据库学习笔记(一)----CHAR,VARCHAR和NVARCHAR

char 固定长度,最长n个字符。 2. varchar 最大长度为n的可变字符串。 (n为某一整数,不同数据库,最大长度n不同) char和varchar区别: varchar必char节省空间,但在效率上比char稍微差一些...

夏尘安 ⋅ 2014/03/25 ⋅ 0

MySql中varchar(10)和varchar(100)的区别==>>以及char的利弊

一般初学会认为,二者占用的空间是一样的。比如说我存储5个char,二者都是实际占用了5个char了【勘误:varchar在实际存储的时候会多一个byte用来存放长度】。 但是深入一下,设计数据库的时候...

JK_OPERA ⋅ 2014/10/21 ⋅ 0

Oracle建表常用数据类型详解(原创)

创建表时,必须为表的各个列指定数据类型。如果实际的数据与该列的数据类型不相匹配,则数据库会拒绝保存。如为学生指定出生日期为“1980-13-31”。 在Oracle中,常见的数据类型有: 字符串:...

postdep ⋅ 2013/07/06 ⋅ 1

大数据之数据库mysql优化实战(一)

:facepunch: 大数据之数据库mysql优化实战(一) 首先你要有数据,不然怎么测试,几百条就算了,还没跑就完了。 本章主题如何向数据库插入10万条数据 创建数据库 ~~~sqlCREATE TABLE ( int(2...

布道牛 ⋅ 2016/03/25 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

IDEA创建SpringMVC+Mybatis+Maven项目

视频如下(加载有点慢请见谅,服务器不太好): 视频

影狼 ⋅ 24分钟前 ⋅ 0

前阿里P8架构师:精准定制Java架构师学习计划!

可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。 有不少朋友问,除了掌握J...

java高级架构牛人 ⋅ 27分钟前 ⋅ 0

zookeper学习

https://blog.csdn.net/u012152619/article/category/6470028

~少司命~ ⋅ 28分钟前 ⋅ 0

Spring MVC ,JSON,JQuery,不懂JQuery,跳过了

/spring-mvc-study/src/main/webapp/course_json.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD ......

颖伙虫 ⋅ 28分钟前 ⋅ 0

2018上海云栖大会workshop-日志数据采集与分析对接

摘要: 日志数据采集与分析对接 课程描述 通过日志服务采集用户、数据库、业务等访问数据。演示对于业务日志分析与处理,程序日志查询与监控,打通日志与数据仓库对接案例。 日志种类 网站访...

阿里云云栖社区 ⋅ 29分钟前 ⋅ 0

mahout demo

package com.datamine.CollaborativeFiltering.mysql; import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood; import org.apache.mahout.cf.taste.impl.recommend......

xiaomin0322 ⋅ 30分钟前 ⋅ 0

red hat openstack 12配置要求

安装 openstack 之前,一般要规划整个系统中,到底要多少台机器来参与openstack, 根据rhosp12的官方文档: 最低要求是3台物理机,1台作为director,一台作为 controller ,一台作为computer....

tututu_jiang ⋅ 32分钟前 ⋅ 0

Rocket-Chip在GitHub上的各个源码

在github上通过搜索Rocket-chip可以得到36个结果:其中 https://github.com/freechipsproject/rocket-chip https://github.com/ucb-bar/riscv-boom https://github.com/ucb-bar/fpga-zynq (......

whoisliang ⋅ 37分钟前 ⋅ 0

【HAVENT原创】CentOS 6.5 下 Nginx 的安装与配置

nginx是轻量级的Web服务器、反向代理服务器及邮件服务器,具有占用内存少,并发能力强的优点,已被广泛应用。本文介绍目前最新版本 1.12.2 的安装。 各版本nginx下载地址:http://nginx.org/...

HAVENT ⋅ 43分钟前 ⋅ 0

查看linux系统重启之前的log -- last_kmsg

当 Linux Kernel 出现 BUG 的时候,后走入 panic flow,这个时候由于 Kernel 出现了严重的问题,adbd 也无法响应 adb 连接请求,这个时候想透过读取 Kernel Log Buffer 来看 Kernel Log 是不...

zyzzu ⋅ 44分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部