zoukankan      html  css  js  c++  java
  • SQL中char、varchar、nvarchar、text 的区别

    char

        char是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值。当你输入的字符大于指定的数时,它会截取超出的字符。

    nvarchar(n)  中间的 n 代表字符的个数,不是字节的个数

        包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。   

    varchar(n)    

     长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。

    text

    按照字符数量来占用空间,用2字节记录存储数据大小,这2字节不占用text数据的空间。没有空间浪费。速度慢,尤其创建临时表的时候会异常悲剧。

    比如:

    char(10),保存’ab’要占用10byte,因为存的是’ab  ’,后面8个空格。

    varchar(10),保存’ab’要占用3byte,数据占2个字符,另外一个字节记录数据大小

    速度

    1、char,定长,基本没有碎片,索引速度极快。

    2、varchar,不定长,索引速度没有char快。理论上可以添加全部索引,但是数据长度太大时索引也会截取数据前面的一部分。

    3、text,不定长,速度慢,索引只能是前缀索引。

    存储限制

    1、char(n),n最大255。

    2、varchar(n),n最大65535,另外,按照字符集,不能超过65525字节。这65535字节不能全用来存数据,因为有1-2字节要用来存占用长度,255字节以下用1字节存储长度,255字节以上用2字节存储长度。

    3、text,上限65535字节,再多也能存,因为还有mediumtext上限2^24-3字节大概16m,longtext上限2^32-4字节大概4G。

    自动去掉尾部空格

    1、char(n),会去掉结尾的空格

    2、varchar(n),不会去掉结尾空格

    3、text,不会去掉结尾空格

    比如:

    1、char(10),保存字符串’ab ’(一个空格),存到数据库就是’ab ’(有8个空格),查询出来就是’ab’(没有空格),占10byte。

    2、varchar(10),保存字符串’ab ’ (有一个空格),存到数据库就是’ab ’(有1个空格),查询出来也是’ab ’(一个空格),占3byte。

    记录数据的大小

    1、varchar(n),按字符长度占用空间,但会有1-2字节来记录数据大小。

    2、text,也按字符长度占用空间,但是记录在数据之外,不占用数据的空间。

    注意

    1、存储定长字符串,尽量用char,索引速度极快。

    2、长度255以上字符串,只能用varchar和text。

    3、能用varchar就不要用text。

    4、text不能设置默认值。

    5、和char或者varchar之类的字段不同,text中存储的内容不会和行数据存在一起,而是数据库另外找地方存储的,数据库自己记了指针。据说varchar(255+)也是这么存的。

    6、text上限比较高,安全性上需要注意,在异常状态下可能会存储非常大的数据,造成很多问题,哪怕用varchar(10000)都能给截断一下呢。

    7、理论上varchar的长度最大65535字符,但能不能这么设置也得看字符集,因为mysql有规定,除了text和blob之类的类型外,单字段长度不能超过65535字节,所以,如果字符集是最基础的latin1,一个字符一个字节,那就可以定义varchar(65535),但如果设置为utf8,一个字符3个字节,那就只能定义varchar(21485)。

    总结

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

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

    3、TEXT:text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。  

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

     总结(char vs varchar vs Text)

    1、char(n)和varchar(n)中间的代表字符的个数,不是字节的个数

    2、如果数据超过n的限制,那么数据将会截断

    3、char是固定宽度,如果数据长度不满足n,那么将会在右边用空格补齐,varchar是变长宽度

    4、varchar是标准类型,text不是标准类型

    5、varchar跟text都最大保存65535字节长度的数据,但是text还有mediymtext/longtext它可以支持存储更多的内容

    6、varchar的存储格式是stored-inline,text的存储格式是off-record。一般情况来说,varchar的速度要比text快

    7、BLOB类型,可以存储大字段。

  • 相关阅读:
    LeetCode 231. 2的幂
    LeetCode 50. Pow(x, n)
    LeetCode 80. 删除有序数组中的重复项 II
    LeetCode 26. 删除有序数组中的重复项
    LeetCode 88. 合并两个有序数组
    LeetCode 781. 森林中的兔子
    在linux下使用 Fitilink 3D Webcam (18e3:5031)
    ros tf2使用示例
    使用QtCreator作为ROS调试器
    linux基于file的logger
  • 原文地址:https://www.cnblogs.com/weibanggang/p/9599217.html
Copyright © 2011-2022 走看看