char类型与varchar类型的区别?
3 个回答
倾城倩影销魂态,如此佳人何处寻。兽神**CHAR** 和 **VARCHAR** 类型在存储和检索方面有所不同,以下是它们的主要区别: #### 1. 长度与存储 - **CHAR**: - **固定长度**:CHAR 类型的列长度固定为创建表时声明的长度,长度范围是 1 到 255。 - **存储方式**:当 CHAR 值被存储时,如果实际长度小于声明的长度,会用空格填充到特定长度。 - **示例**: ```sql CREATE TABLE example ( col CHAR(10) ); -- 存储 'abc' 实际占用 10 个字符空间,'abc' 后面填充了 7 个空格。 ``` - **VARCHAR**: - **可变长度**:VARCHAR 类型的列长度可以变动,长度范围是 1 到 65535。 - **存储方式**:VARCHAR 存储实际长度的数据,并附加一个字节或两个字节来记录数据长度(长度 <= 255 时为 1 字节,长度 > 255 时为 2 字节)。 - **示例**: ```sql CREATE TABLE example ( col VARCHAR(10) ); -- 存储 'abc' 实际占用 4 个字符空间(3 个字符 + 1 个字节的长度信息)。 ``` #### 2. 检索与空格处理 - **CHAR**: - **空格处理**:检索 CHAR 值时,MySQL 会删除尾随的填充空格。 - **示例**: ```sql SELECT col FROM example WHERE col = 'abc'; -- 实际存储的 'abc' 是 'abc '(7 个空格),检索时 MySQL 会删除尾随空格,返回 'abc'。 ``` - **VARCHAR**: - **空格处理**:VARCHAR 类型存储和检索数据时不会自动删除空格,存储什么就检索什么。 - **示例**: ```sql SELECT col FROM example WHERE col = 'abc'; -- 存储和检索的 'abc' 就是 'abc',不会自动添加或删除空格。 ``` #### 3. 性能与使用场景 - **CHAR**: - **性能**:由于固定长度,CHAR 类型的存储和检索速度较快,适用于存储长度固定的数据,如身份证号码、状态码等。 - **适用场景**:长度固定的字段,性能要求较高的场景。 - **VARCHAR**: - **性能**:由于可变长度,VARCHAR 类型的存储和检索速度稍慢,适用于存储长度不固定的数据,如用户名、电子邮件地址等。 - **适用场景**:长度不固定的字段,需要节省存储空间的场景。 ### 总结 - **CHAR**: - 固定长度,长度范围 1 到 255。 - 存储时用空格填充到指定长度,检索时删除尾随空格。 - 适用于长度固定且性能要求较高的场景。 - **VARCHAR**: - 可变长度,长度范围 1 到 65535。 - 存储实际数据长度,并附加长度信息字节,检索时不自动删除空格。 - 适用于长度不固定且需要节省存储空间的场景。编辑于 2024-11-24 19:43 •IP属地 美国举报评论收藏
二八佳人体似酥,腰间仗剑斩凡夫。小菜鸟char类型 char类型是定长的,在内部存储时实际使用长度较短时会在右边用空格填充,所以插入的数据如果右边有空格会自动截断,因为没有办法知道是自带的还是填充的。 对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节。 适合每行数据的长度比较平均的情况,否则会造成存储空间的浪费。 varchar类型 是不定长的,有一个字节用来存储长度(当长度大于255时,使用两个字节来存储长度),内部存储时,使用多少长度,内存中就占用多少长度,不会有空余,所以比较节省空间。 varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节。 效率上其实varchar会好一点,其实网上没有比较详尽的测试,看一个博客对1000w的数据进行测试时,varchar会略高一点。发布于 2022-02-11 15:34 •IP属地 辽宁举报评论收藏
不必太张扬,是花自然香。ketty在MySQL中,varchar和char都是可以存储字符串的类型,并且,在设计数据表时,必须明确的指定长度! varchar是变长的,假设某字段设计为varchar(10),当存入的是"java"字符串时,实际存入4个字符,则实际占用也是4个字符的空间大小; char是定长的,假设某字段设计为char(10),当存入的是"java"字符串时,将要存入的4个字符比设计的varchar(10)中指定的数量要少,则会补充6个空格,以达到10个字符,则实际占用也是10个字符的空间大小; 所以,如果要存入的字符串的长度不固定,应该使用varchar类型,只有长度固定的情况下才使用char。 在MySQL处理varchar类型时,默认情况下,还会使用额外的1个字节记录“实际存入的字符数量”,也就是说,将"java"存入到varchar(10)的字段中,MySQL还会使用额外的1个字节空间记下4这个数量值,后续,当读取这个值时,MySQL会先读取这个4,然后再开始获取字段中的数据;而char类型就不存在这个问题,因为使用char类型存储的字符串的长度一定是固定的(即使不固定,也会添加空格,使得该字段的所有字符串的长度都与字段的设计值保持一致)。 当然,在处理varchar类型时,由于默认情况下只使用1个字节记录“实际存入的字符数量”,所以,在这种情况下能够存入的字符数量最多是255个(1个字节能表示的最大正数),当需要存入更多数据时,MySQL会自动扩容,使用2个字节记录“实际存入的字符数量”,能够表示的最大正数就是65535,并且,不会再扩容,所以,使用varchar最多存储65535个字符! 所以,综合来看,其实varchar类型的数据将占用更多的存储空间(需要使用额外的字节作记录),同时,查询效率偏低,所以,虽然使用char能够存储的数据换成使用varchar也都能正常存储和使用,但是,在能够使用char的应用场景,应该优先使用char。发布于 2022-02-08 00:35 •IP属地 云南举报评论收藏
公众号进入网站体验更佳

