一、CHAR与 VARCHAR

CHAR 用于存储固定长度的数据,CHAR字段上的索引效率级高,但是不适用于字符长度不确定的数据。比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。

VARCHAR 为了解决上面提到问题,SQL设计了专门存储可变长度的数据类型,但相应的损失存储效率。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。

VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。

用法:从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。


二、TEXT 与 BLOG

TEXT:存储可变长度的非Unicode数据,最大长度为 65535 (2^16-1) 个字符 。

MEDIUMTEXT :存储可变长度的非Unicode数据,最大长度为 16777215 (2^24-1) 个字符。

LONGTEXT :存储可变长度的非Unicode数据,最大长度为 2147483647 (2^32-1) 个字符。

TINYTEXT :存储可变长度的非Unicode数据,最大长度为 255 (2^8-1) 个字符。

与TEXT类似的数据类型是BLOG,区别是

  • BLOB保存二进制数据,TEXT保存字符数据。

    使用BLOB的优势在于文本和图片都可以以二进制的形式存储在数据库中。但是,不幸的是,现在大部分得图片都是以标签引入到前端的,而且图床和CDN的出现直接导致我们自己的数据库中只会存储文本数据,也就是说比较常用的是 TEXT。

  • BLOB列没有字符集,排序和比较基于列值字节的数值。TEXT列有一个字符集,会根据字符集的校对规则对值进行排序和比较 。那么,在存储包含中文字符时,建议使用 TEXT。

TEXT 与 BLOG 的共同点:

  • 有四种不同字符长度限制的数据类型
  • 当保存或检索BLOB和TEXT列的值时不删除尾部空格。
  • 对于BLOB和TEXT列的索引,必须指定索引前缀的长度。
  • BLOB和TEXT列不能有默认值。
  • 当排序时只使用该列的前max_sort_length个字节。max_sort_length的 默认值是1024。
  • 当你想要使超过max_sort_length的字节有意义,对含长值的BLOB或TEXT列使用GROUP BY或ORDER BY的另一种方式是将列值转换为固定长度的对象。标准方法是使用SUBSTRING函数。
  • BLOB或TEXT对象的最大大小由其类型确定,但在客户端和服务器之间实际可以传递的最大值由可用内存数量和通信缓存区大小确定。你可以通过更改max_allowed_packet变量的值更改消息缓存区的大小,但必须同时修改服务器和客户端程序。

用法:如果不涉及存储图片与文本混合的二进制数据,或者存储中文文本是,建议使用TEXT


三、NCHAR、NVARCHAR、NTEXT

在前面几种类型前加N。它表示存储的是Unicode数据类型的字符。

英文一般只需要字母表和一些符号字符组成的编码表,因只需要一个字节就可以存储字符。但是中文里的每个汉字并不是字母的排列组合,需要更多的存储空间,一般会占用两个字节。

为了兼容不同语言的字符,需要使用 Unicode 字符集,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。

可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。

用法:如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar。