问题

一个小型的文章系统的网站,用来存储内容content的字段,我选择的是varchar(8000),最多可容纳4000汉字,对绝大多数用户来说,应该够用了。但是一个问题是允许用户输入代码(HTML,JS,CSS等),实际上如果存储代码的话,会变得更多

那么是用varchar还是text?还是别的?

结论

text

资料

TEXT

TEXT有4有类型:

  • TINYTEXT 256bytes
  • TEXT 64kb
  • MEDIUMTEXT 16Mb
  • LONGTEXT 4GB

使用注解

@Lob
@Basic(fetch=FetchType.LAZY)
@Column(columnDefinition="TEXT",nullable=true)
public String getContent() {
    return Content;
}

BLOB

TINYBLOB

  • BLOB、
  • MEDIUMBLOB
  • LONGBLOB

blob 保存的是二进制数据,利用这个特性,可以把图片存储到数据库里面。text只能存储文本。

使用注解

@Lob
@Basic(fetch=FetchType.LAZY)
@Column(columnDefinition="BLOB",nullable=true)
public String getContent() {
    return Content;
}

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

CHAR与 VARCHAR

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

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

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

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

NCHAR、NVARCHAR、NTEXT

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

  • 英文一般只需要字母表和一些符号字符组成的编码表,因只需要一个字节就可以存储字符。但是中文里的每个汉字并不是字母的排列组合,需要更多的存储空间,一般会占用两个字节。
  • 为了兼容不同语言的字符,需要使用 Unicode 字符集,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。
  • 可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。

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

mysql中text,longtext,mediumtext区别

一、概览

在 MySQL 中,text、mediumtext 和 longtext 都是用来存储大量文本数据的数据类型。

  • TEXT:TEXT 数据类型可以用来存储最大长度为 65,535(2^16-1)个字符的文本数据。如果存储的数据超过了这个长度,MySQL 将会抛出错误。
  • MEDIUMTEXT:MEDIUMTEXT 数据类型可以用来存储最大长度为 16,777,215(2^24-1)个字符的文本数据。相比于 TEXT 类型,MEDIUMTEXT 类型可以存储更多的数据。
  • LONGTEXT:LONGTEXT 数据类型可以用来存储最大长度为 4,294,967,295(2^32-1)个字符的文本数据。它是所有文本类型中存储数据最多的一种。

在这些数据类型中,存储的数据越大,占用的存储空间也会越大。因此,在设计数据库时,应该根据实际情况来选择合适的数据类型,避免浪费存储空间。

另外,需要注意的是,这些数据类型都是 Unicode 字符集(UTF-8)编码的。如果需要存储非 Unicode 字符集的数据,可以选择其他的数据类型,比如 CHAR 或 VARCHAR。

除了存储容量上的差别,这些文本类型之间还有一些其他的区别。

  • 存储空间:在存储相同的数据时,LONGTEXT 类型所占用的存储空间要比 MEDIUMTEXT 和 TEXT 类型更大。
  • 性能:由于 LONGTEXT 类型占用的存储空间更大,因此在执行查询和排序等操作时,LONGTEXT 类型的数据需要更长的时间。
  • 索引:由于文本类型的数据比较大,因此在使用索引时需要特别注意。如果要对文本类型的数据建立索引,需要使用前缀索引或全文索引等技术,以避免性能问题。
    数据类型:虽然这些文本类型都可以存储大量的文本数据,但是它们在 MySQL 中的数据类型是不同的。TEXT 类型是 TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT 中存储数据最小的一种。因此,如果需要存储较小的文本数据,可以使用 TINYTEXT 类型。

总之,在设计数据库时,应该根据实际需求选择合适的数据类型。如果需要存储较小的文本数据,可以使用 TINYTEXT 类型;如果需要存储大量的文本数据,则可以使用 MEDIUMTEXT 或 LONGTEXT 类型。在使用索引时,应该注意避免性能问题。

二、字节限制不同

1、text 字段类型:text 字段类型的字节限制为 65535 字节。

2、longtext 字段类型:longtext 字段类型的字节限制为 2147483647 字节。

3、mediumtext 字段类型:mediumtext 字段类型的字节限制为 16777215 字节。

三、I/O 不同

1、text 字段类型:text 字段类型比 longtext、mediumtext 字段类型更不容易造成多余的 I/O。

2、longtext 字段类型:longtext 字段类型比 text、mediumtext 字段类型更容易造成多余的 I/O。

3、mediumtext 字段类型:mediumtext 字段类型比 text 字段类型更容易造成多余的 I/O,比 longtext 字段类型更不容易造成多余的 I/O。

四、行迁移不同

1、text 字段类型:text 字段类型比 longtext、mediumtext 字段类型更容易进行行迁移。

2、longtext 字段类型:longtext 字段类型比 text、mediumtext 字段类型更不容易进行行迁移。

3、mediumtext 字段类型:mediumtext 字段类型比 text 字段类型更不容易进行行迁移,比 longtext 字段类型更容易进行行迁移。