`
outlaw
  • 浏览: 29672 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

MySQL字符串列类型区分

阅读更多

MySQL字符串列类型区分

 

1.

 

首先CHAR, VARCHAR, TEXTBINARY, VARBINARY, BLOB的区别:

 

CHAR, VARCHAR, TEXT称为非二进制字符串;

 

BINARY, VARBINARY, BLOB称为二进制字符串;

 

二进制字符串和非二进制字符串的区别是:
二进制字符串包含的是字节字符串,非二进制字符串包含的是字符字符串;

 

后者可以定义字符集,前者不可以;

 

而且排序和比较前者基于列值字节的数值值,后者则根据字母顺序进行排序或比较;

 

 

BINARY类似与CHAR类型,但是保存二进制字符串而不是非二进制字符串;

 

VARBINARY类似与VARCHAR类型,但是保存二进制字符串而不是非二进制字符串;
同样类似的BLOB对应TEXT类型(相应的有TINYBLOBBLOBMEDIUMBLOBLONGBLOBTINYTEXTTEXTMEDIUMTEXTLONGTEXT)

 

2.

 

CHARVARCHAR相同之处:

 

都可以定义字符串的长度,如CHAR(M), VARCHAR(M)

 

 

不同之处:

 

CHAR(M)定义的列的长度为固定的,M取值可以为0255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。

 

 

VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL

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

 

 

CHARVARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录字符串长度的字节(如果超过255则需要两个字节)

 

 

如果分配给CHARVARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

 

 

由于BINARYVARBINARY分别与CHARVARCHAR对应,因此两者的区别也和CHARVARCHAR的区别类似。

 

VARBINARY定义的M值范围为0<=M<=255

 

3. VARCHARTEXT类型的区别:

 

TEXT类型不需要指定M值,其他方面与VARCHAR都类似:比如存储的是可变长度,即不够的部分不需要右边空格填充;等等。

 

TEXTVARCHAR类似,实际需要保存字符串本身外加两个字节保存字符串的实际长度。

 

看下表容易理解上面讲述的区别:

 

字符串类型的存储需求(M为最大长度,L实际存储字符串的长度)

 

列类型

 

 

存储需求

 

 

CHAR(M)

 

 

M个字节,0 <= M <= 255 (L为固定的=255,不够补空格)

 

 

VARCHAR(M)

 

 

L+1个字节,其中L <= M 0 <= M <= 65535(参见下面的注释)(MySQL5.0之前都是最大255)

 

 

BINARY(M)

 

 

M个字节,0 <= M <= 255

 

 

VARBINARY(M)

 

 

L+1个字节,其中L <= M 0 <= M <= 255

 

 

TINYBLOB, TINYTEXT

 

 

L+1个字节,其中L < 28 (256)

 

 

BLOB, TEXT

 

 

L+2个字节,其中L < 216 (65536)

 

 

MEDIUMBLOB, MEDIUMTEXT

 

 

L+3个字节,其中L < 224

 

 

LONGBLOB, LONGTEXT

 

 

L+4个字节,其中L < 232

 

 

ENUM('value1','value2',...)

 

 

12个字节,取决于枚举值的个数(最多65,535个值)

 

 

SET('value1','value2',...)

 

 

1234或者8个字节,取决于set成员的数目(最多64个成员)

 

 


解释:

 

CHAR(M)为固定长度,而且M必须要在0255之间;

 

VARCHAR(M)保存可变长度,M定义了最大长度,M取值065535之间;

 

TINYTEXT不需要定义长度M值,长度范围不超过28 (256)

 

TEXT不需要定义长度M值,长度范围不超过216 (65536)

 

下面类似。。。

 

 

对于二进制字符串形式:BINARY(M)VARBINARY(M)TINYBLOBBLOB等类似。

 

 

 

更详细的信息参考如下链接:

 

http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#string-types

 

 

4.

 

其他一些参考信息:

 

1CHARCHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

 

2VARCHAR。存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+<chmetcnv unitname="”" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1”</chmetcnv>呢?这一个字节用于保存实际使用了多大的长度。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

 

3NCHARNVARCHARNTEXT。这三种从名字上看比前面三种 多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文 与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个 字节表示。ncharnvarchar的长度是在14000之间。和charvarchar比较起来,ncharnvarchar则最多存储 4000个字符,不论是英文还是汉字;而charvarchar最多能存储8000个英文,4000个汉字。可以看出使用ncharnvarchar 数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。

 

所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

但是注意

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    MySQL 字符类型大小写敏感

    mysql字符类型默认是不区分大小写的,即select * from t where name=’AAA’与=’aaa’没区别,以下是测试的例子 (root@localhost)[hello]&gt; create table test1(id int, name varchar(10)); (root@localhost)[hello...

    php 不同编码下的字符串长度区分

    UTF-8的中文字符串是三个字节 复制代码 代码如下: &lt;?... echo ‘-‘; echo mb_strlen(‘测试文字a测试文字’,’utf-8′);... 输出:17-9 在Mysql数据库(5.1以后的版本)中,如果字段类型为varchar(10)

    【数据面试系列】MySQL高频面试题及知识要点.pdf

    第一部分 问题 1. MySQL基础知识 Q : 三大范式是什么? Q : Mysql 查询是否区分大小写? Q : 如何定义 REGEXP? Q : 什么是视图?什么是存储过程?...Q : 列的字符串类型可以是什么?实际考察几种类型的区别。

    MySQL面试题,经典

    12、列的字符串类型可以是什么 13、如何获取当前的 Mysql 版本 14、Mysql 中使用什么存储引擎 15、Mysql 驱动程序是什么 16、TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上做什么 17、主键和候选键有什么区别 ...

    mysql的日期和时间函数

    expr 是一个字符串;它可以以一个 “-” 领头表示一个负的间隔值。type 是一个关键词,它标志着表达式以何格式被解释。 下表显示 type 和 expr 参数是如何关联的:  type 值 expr 期望的格式 SECOND ...

    MYSQL的binary解决mysql数据大小写敏感问题的方法

    BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写

    SQL优化面试专题.pdf

    列的字符串类型可以是什么?如何获取当前的 Mysql 版本?Mysql 中使用什么存储引擎?Mysql 驱动程序是什么?TIMESTAMP 在 UPDATE CURRENT_TIMESTAMP 数据类型上做什么?如何使用 Unix shell 登录 Mysql?myisamchk ...

    【mysql面试题】100道MySQL数据库经典面试题解析

    如何字段类型是字符串,where时一定用引号括起来,否则索引失效   like通配符可能导致索引失效。   联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。   在索引列上使用mysql的内置函数,...

    MySQL数据库经典面试题解析

    如何字段类型是字符串,where时一定用引号括起来,否则索引失效 like通配符可能导致索引失效。 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。 在索引列上使用mysql的内置函数,索引失效。 对索引列...

    MySQL面试经典100题(收藏版,附答案).doc

    如何字段类型是字符串,where时一定用引号括起来,否则索引失效 like通配符可能导致索引失效。 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。 在索引列上使用mysql的内置函数,索引失效。 对...

    ORACLE,mysql,sqlserver,sybase数据库装文本软件

    2.支持任意字符串作为列分隔符,什么竖线逗号或者十六进制字符及任意组合字符串都行 3.支持任意字符串作为每行分隔符,例如\r,\r\n,或者十六进制字符或任意指定的字符串(例如可实现把整个日志文件装入数据库的单个...

    关于mysql 的时间类型选择

    间类型:尽量使用TIMESTAMP类型,... 您可能感兴趣的文章:详解MySQL查询时区分字符串中字母大小写的方法mysql时区问题有关 PHP 和 MySQL 时区的一点总结MySql查询时间段的方法mysql之TIMESTAMP(时间戳)用法详解mysq

    mysql时区问题

    您可能感兴趣的文章:MySQL修改时区的方法小结MySQL查看和修改时区的方法详解MySQL查询时区分字符串中字母大小写的方法mysql中url时区的陷阱该如何规避详解MySQL timestamp的类型与时区实例详解有关 PHP 和

    Python Cookbook

    5.2 不区分大小写对字符串列表排序 185 5.3 根据对象的属性将对象列表排序 187 5.4 根据对应值将键或索引排序 189 5.5 根据内嵌的数字将字符串排序 192 5.6 以随机顺序处理列表的元素 193 5.7 在增加元素时保持...

    入门学习Linux常用必会60个命令实例详解doc/txt

    在使用mount这个指令时,至少要先知道下列三种信息:要加载对象的文件系统类型、要加载对象的设备名称及要将设备加载到哪个目录下。 (1)Linux可以识别的文件系统 ◆ Windows 95/98常用的FAT 32文件系统:vfat ;...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    PHP开发实战1200例源码

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则...

    ajax异步留言

    为json的时候,response.Write(string)中的字符串一定要符合json的格式为否则会出现解析错误, 这个和aspx页是一样的。 如果要使用session的话,在handler的代码中添加System.Web.SessionState的引用, 并让这个...

Global site tag (gtag.js) - Google Analytics