mysql的char和varchar_MySQL的char和varchar

1.varchar类型的变化

MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用可变长的varchar来存放,这样就能有效的减少数据库文 件的大小。

MySQL 数据库的varchar类型在4.1以下的版本中,nvarchar(存储的是Unicode数据类型的字符)不管是一个字符还是一个汉字,都存为2个字节 ,一般用作中文或者其他语言输入,这样不容易乱码 ;varchar: 汉字是2个字节,其他字符存为1个字节 ,varchar适合输入英文和数字。

4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 ;varchar(20)在Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同,具体有以下规则:

a) 存储限制

varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。

b) 编码长度限制

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。

若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

c) 行长度限制

导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to     change some columns to TEXT or BLOBs。

2.CHAR(M), VARCHAR(M)不同之处

CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录字符串长度的字节(如果超过255则需要两个字节)。如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

3. VARCHAR和TEXT、BlOB类型的区别

VARCHAR,BLOB和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度 ,加上1个字节以记录字符串的长度。对于字符串'abcd',L是4而存储要求是5个字节。

BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。VARCHAR需要定义大小,有65535字节的最大限制;TEXT则不需要。如果你把一个超过列类型最大长度的值赋给一个BLOB或TEXT列,值被截断以适合它。

一个BLOB是一个能保存可变数量的数据的二进制的大对象。4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最大长度方面有所不同。

BLOB 可以储存图片,TEXT不行,TEXT只能储存纯文本文件。4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于4个BLOB类型,并且有同样的最大长度和存储需求。在BLOB和TEXT类型之间的唯一差别是对BLOB值的排序和比较以大小写敏感方式执行,而对TEXT值是大小写不敏感的。换句话说,一个TEXT是一个大小写不敏感的BLOB。

4.总结char,varchar,text区别

长度的区别,char范围是0~255,varchar最长是64k,但是注意这里的64k是整个row的长度,要考虑到其它的column,还有如果存在not null的时候也会占用一位,对不同的字符集,有效长度还不一样,比如utf8的,最多21845,还要除去别的column,但是varchar在一般情况下存储都够用了。如果遇到了大文本,考虑使用text,最大能到4G。

效率来说基本是char>varchar>text,但是如果使用的是Innodb引擎的话,推荐使用varchar代替char

char和varchar可以有默认值,text不能指定默认值

数据库选择合适的数据类型存储还是很有必要的,对性能有一定影响。这里在零碎记录两笔,对于int类型的,如果不需要存取负值,最好加上unsigned;对于经常出现在where语句中的字段,考虑加索引,整形的尤其适合加索引。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【问题收集·知识储备】Xcode只能选择My Mac,不能选择模拟器如何解决?

网友问题:请问打开一个应用,只能选择My Mac,不能选择模拟器如何解决? 答案: 下面将问答过程记录如下: CHENYILONG Blog请问打开一个应用,只能选择My Mac,不能选择模拟器如何解决? 网友的问题 09…

typedef的使用方法

typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,与宏定义有些差异。它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。 使用typedef为现有类型创建别名,定义易于记忆的…

SQL Server CLR全功略之一---CLR介绍和配置

Microsoft SQL Server 现在具备与 Microsoft Windows .NET Framework 的公共语言运行时 (CLR) 组件集成的功能。CLR 为托管代码提供服务,例如跨语言集成、代码访问安全性、对象生存期管理以及调试和分析支持。对于 SQL Server 用户和应用程序开发人员来说&#xff0…

mysql select 子查询_SELECT中常用的子查询操作

MySQL中的子查询 是在MySQL中经常使用到的一个操作,不仅仅是用在DQL语句中,在DDL语句、DML语句中也都会常用到子查询。 子查询的定义: 子查询是将一个查询语句嵌套在另一个查询语句中; 在特定情况下,一个查询语句的条件需要另一个查询语句来获取,内层查询(inner query)语…

视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

说好的给园子里的朋友们录制与《ASP.NET MVC 使用 Petapoco 微型ORM框架NpgSql驱动连接 PostgreSQL数据库》 这篇博客相对应的视频,由于一个月一来没有时间录制,今天我兑现了给朋友们的承诺。。 本次视频教程的目录为 视频、代码、资料,其中视…

ARM中各始终之间的关系,FCLK HCLK PCLK的关系

ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3); ChangeClockDivider(key, 12); 1)FLCK、HCLK和PCLK的关系 S3C2440有三个时钟FLCK、HCLK和PCLK s3c2440官方手册上说P7-8写到: FCLK is used by ARM920T…

CSS垂直居中总结

原文:CSS垂直居中总结工作中遇到垂直居中问题&#xff0c;特此总结了一下几种方式与大家分享。本文讨论的垂直居中仅支持IE8 1、使用绝对定位垂直居中 <div class"container"><!--<div class"floater"></div>--><div class&quo…

mysql添加表字段脚本_mysql数据库修改字段及新增字段脚本

1.修改字段的长度ALTER TABLE MODIFY COLUMN 字段名 数据类型(修改后的长度)例句&#xff1a;ALTER TABLE test_table MODIFY COLUMN id INT(20)2.修改字段的名称alter table change 。例句&#xff1a;ALTER TABLE test_table CHANGE attence_name NAME VARCHAR(20)3.新增字…

java transient简单介绍

我们都知道一个对象仅仅要实现了Serilizable接口&#xff0c;这个对象就能够被序列化&#xff0c;java的这样的序列化模式为开发人员提供了非常多便利&#xff0c;我们能够不必关系详细序列化的过程&#xff0c;仅仅要这个类实现了Serilizable接口&#xff0c;这个的全部属性和…

struct和typedef struct区别

分三块来讲述&#xff1a;   1 首先&#xff1a;//注意在C和C里不同     在C中定义一个结构体类型要用typedef: typedef struct Student{int a;}Stu; 于是在声明变量的时候就可&#xff1a;Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明)     这里…

单元测试代码:SpringTest+JUnit

2019独角兽企业重金招聘Python工程师标准>>> /*** JUnit单元测试父类&#xff0c;配置了Spring的基础环境。 <br/>* 可以作为Controller、Service、Dao单元测试的父类。* * author leiwenfansunion.cn*/ public class JUnitTestBase {public static XmlWebApp…

mysql类 php100_php mysql 类

1 <?php2 /**3 * MySQL 数据库操作工具类, 方便数据库操作.4 * 示例见底部注释.5 * author: fuck me every day6 */7 class Mysql{8 var $conn;9 var $query_list array();10 public $query_count 0;1112 public function __construct($c){13 if(!isset($c[port])){14 $c…

SQL Server 索引和表体系结构(三)

SQL Server 索引和表体系结构&#xff08;三&#xff09; 原文:SQL Server 索引和表体系结构&#xff08;三&#xff09;包含列索引 概述 包含列索引也是非聚集索引&#xff0c;索引结构跟聚集索引结构是一样&#xff0c;有一点不同的地方就是包含列索引的非键列只存储在叶子节…

简单了解线程和进程、多进程和多线程、并发和并行的区别

一&#xff1a;线程与进程 1.概念 线程&#xff1a;是程序执行流的最小单元&#xff0c;是系统独立调度和分配CPU&#xff08;独立运行&#xff09;的基本单位。 进程&#xff1a;是资源分配的基本单位。一个进程包括多个线程。 2.区别&#xff1a; 1.线程与资源分配无关&…

jdbc mysql demo_JDBC_demo:java连接mysql过程

1.任何数据库驱动程序都提供对java.sql.Driver接口的驱动类&#xff0c;mysql-connector-java-5.1.39-bin.jar中Driver&#xff1a;packagecom.mysql.jdbc;importjava.sql.DriverManager;importjava.sql.SQLException;public class Driver extendsNonRegisteringDriverimplemen…

Java中发邮件的6种方法

2019独角兽企业重金招聘Python工程师标准>>> 1.官方标准JavaMail Sun&#xff08;Oracle&#xff09;官方标准&#xff0c;功能强大&#xff0c;用起来比较繁琐。 官方资料&#xff1a;http://www.oracle.com/technetwork/java/javamail/index.html 2.第三方实现…

查询字符串某个字符的个数

select len(05011045)-len(replace(05011045,0,))转载于:https://www.cnblogs.com/zwc-blog/p/3787888.html

假定Csomething是一个类,执行下面这些语句后,内存里创建了几个Csomething对象

假定Csomething是一个类&#xff0c;执行下面这些语句后&#xff0c;内存里创建了几个Csomething对象 Csomething a(); Csomething b(2); Csomething c[3]; Csomething &ra b; Csomething d b; Csomething *pA c; Csomething *p new Csomething(4); Csomething a();/…

用mongo实现mysql视图_浅谈 MongoDB 的视图

2018 年 9 月 18 日&#xff0c;由 Robert Gravelle 撰写在关系数据库中&#xff0c;视图是由查询定义的可搜索数据子集。视图有时被称为“虚拟表”&#xff0c;因为它们不存储数据&#xff0c;但可以像表一样被查询。MongoDB 最近在版本 3.4 中引入了视图。在今天的文章中&…

将DataTable 数据插入 SQL SERVER 数据库

原文:将DataTable 数据插入 SQL SERVER 数据库 以下提供3中方式将DataTable中的数据插入到SQL SERVER 数据库&#xff1a;一&#xff1a;使用sqlcommand.executenonquery()方法插入 foreach (DataRow datarow in datatable.Rows) { string sql "INSERT INTO [Table_1] ([…