本文旨在涵盖两种数据类型的相似性和差异。两者几乎相同,但在某些方面,两略有不同。
CHAR和VARCHAR几乎相同,但在存储和从数据库中检索数据的阶段,两者都不同。 对于这两种数据类型,我们必须传递length说明符,它表示字段可以保存多少数据。例如char(30)和varchar(30),这意味着这些数据类型的字段最多可以容纳30个字符。 对于CHAR,此长度可以是从0到255之间的任何值,对于VARCHAR可以是从0到65,535。但对于VARCHAR,此最大限制取决于您使用的最大行大小和字符集。 数据存储 在这两种类型中,数据的存储是非常不同的。首先是CHAR的情况。
当值存储在CHAR字段中时,剩余的字符将用空格填充。 例如,一个字段是“name CHAR(5)”,并且您要存储只是“jack”,则实际值将存储为“jack ”。
name CHAR (5 )
---------------------------------------
value actual_storage
---- -----------------------------------
'EX' '恩'
'EXPER' 'EXPER'
'专家' ' exper '
---------------------------------------
与CHAR不同,VARCHAR只占用基于存储的数据的空间,因此,例如,如果我们有20个字节放入VARCHAR(30)的,那么这将占据基于数据大小的空间(20字节)。 VARCHAR的另一件事是,如果数据小于255个字符,则使用1个字节,对于大于255个字符的数据,则占用2个字节作为长度前缀
对于这两种数据类型,如果传递的数据大于指定的长度,MySQL将截断数据以适应创建表时指定的长度,并且将返回警告。但是,如果SQL Strict模式未启用,情况将是这样。 但是如果你想限制数据的截断,你应该在MySQL中启用严格模式。所以它会为查询生成错误。
name VARCHAR (5 )
---------------------------------------
value actual_storage
---- -----------------------------------
'EX' '恩'
'EXPER' 'EXPER'
'专家' ' exper '
---------------------------------------
这两种类型的数据检索也非常不同。
如上所述,如果提供的数据较少,CHAR将向数据中添加空格,因此在检索数据时,它将删除添加的空格并提供数据。
只会存储您通过查询的数据,如CHAR,它不会对数据执行任何空间删除过程。
所以现在的问题是,哪一个使用?使用这些数据类型完全取决于需要。
为什么?想象一下,MySQL想要检索集合的第10个记录。 使用VARCHAR,它必须读取第一个记录的前缀以知道第二个开始的哪个字节,等等。 只有CHAR,MySQL知道每个记录是x字节长,因此第10个记录是在10 * x字节文件。 因此,使用大型事实表时,只使用CHAR类型是一个很好的做法。 它可以大大减少您的I / O。删除空格的时间与此相比显然可以忽略不计。
原文:http://www.xpertdeveloper.com/2011/12/char-varchar-in-mysql/