面试题:char和varchar的区别?

简介: 字节面试题:char和varchar的区别?

面试题:char和varchar的区别?


char 和 varchar 的定义和存储方式


1. char 数据类型


定义: char 是一种固定长度的字符数据类型,在创建表时需要指定其长度,长度范围为 0 到 255 个字符。


存储方式: char 类型在存储时会按照指定的长度进行存储,如果实际字符长度小于指定长度,会使用空格填充。

CREATE TABLE char_example (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name CHAR(10)
);

以上SQL代码创建了一个名为 char_example 的表,其中包含两列:id 和 name。name 列使用了 CHAR(10) 数据类型,表示它将存储最多10个字符的固定长度字符串。


当向该表插入数据时,并且为 name 列赋值时,该值将以固定长度的10个字符存储。如果赋值的字符串长度小于10个字符,MySQL会使用空格填充以达到指定的长度。


例如,如果将字符串 ‘John’ 插入到 name 列中,它将以 'John ’ 的形式存储,其中空格填充以达到10个字符的长度。


这种存储机制确保了存储在 CHAR 列中的每个值占用相同的空间,这在某些情况下可以提高性能。但是,在使用 CHAR 列存储可变长度数据时,需要考虑存储空间的潜在浪费问题。


2. varchar 数据类型


定义: varchar 是一种可变长度的字符数据类型,在创建表时同样需要指定其最大长度,长度范围也为 0 到 65535 个字符。


存储方式: varchar 类型在存储时只会占用实际数据所需的存储空间,不会额外使用空间进行填充。

CREATE TABLE varchar_example (
    id INT AUTO_INCREMENT PRIMARY KEY,
    description VARCHAR(255)
);

以上SQL代码创建了一个名为 varchar_example 的表,其中包含两列:id 和 description。description 列使用了 VARCHAR(255) 数据类型,表示它将存储最多255个字符的可变长度字符串。


与 CHAR 类型不同,VARCHAR 类型在存储时只会占用实际数据所需的存储空间,而不会额外使用空间进行填充。这意味着,如果我们将较短的字符串存储在 VARCHAR 列中,它将只占用实际字符串长度所需的空间,而不会在后面填充空格。


例如,如果将字符串 ‘John’ 插入到 description 列中,它将只以 ‘John’ 的形式存储,不会额外填充空格。这样的存储机制可以减少存储空间的浪费,特别是在存储大量可变长度数据时,可以节省大量的存储空间。


char 和 varchar 的优缺点比较


1. char 类型的优点

固定长度: char 类型的数据长度是固定的,因此可以保证数据在存储和检索时的效率。

更快的检索速度: 由于数据长度固定,char 类型的数据检索速度比较快。


2. char 类型的缺点

空间浪费: 由于 char 类型存储时会填充空格,如果实际数据长度远小于指定长度,则会造成空间浪费。

不适合存储变长数据: 对于长度不固定的数据,使用 char 类型会导致空间的浪费。


3. varchar 类型的优点

节省空间: varchar 类型只会占用实际数据所需的存储空间,可以节省存储空间。

适合存储变长数据: 对于长度不固定的数据,使用 varchar 类型更为合适。


4. varchar 类型的缺点

检索速度略慢: 由于 varchar 类型的数据长度不固定,可能会导致检索速度略慢于 char 类型。


char 和 varchar 在实际应用中的选择和使用


选择 char 类型的场景:

  • 数据长度固定且较长的情况,例如国家代码、邮政编码等。
  • 需要保证数据存储和检索效率的场景。


选择 varchar 类型的场景:

  • 数据长度不固定,长度较短的情况,例如用户名、地址等。
  • 对存储空间有较高要求的场景。
-- 创建一个表用于演示 char 和 varchar 类型的使用
CREATE TABLE char_vs_varchar_selection (
    id INT AUTO_INCREMENT PRIMARY KEY,
    country_code CHAR(3),
    postal_code CHAR(6),
    username VARCHAR(20),
    address VARCHAR(255)
);

-- 插入一些数据用于演示
INSERT INTO char_vs_varchar_selection (country_code, postal_code, username, address) 
VALUES ('USA', '123456', 'john_doe', '123 Main Street, City, State, Zip');

INSERT INTO char_vs_varchar_selection (country_code, postal_code, username, address) 
VALUES ('UK', 'AB12CD', 'alice_smith', '456 High Street, Town, County, Postal');

INSERT INTO char_vs_varchar_selection (country_code, postal_code, username, address) 
VALUES ('CAN', 'A1B2C3', 'mary_jane', '789 Maple Avenue, Village, Province, Postal');

INSERT INTO char_vs_varchar_selection (country_code, postal_code, username, address) 
VALUES ('FRA', '75001', 'pierre_dubois', '10 Rue de la Paix, Paris');

-- 查看表的数据
SELECT * FROM char_vs_varchar_selection;
相关文章
|
1天前
|
存储
char *str,char &str,char *& str和char str的区别
char *str,char &str,char *& str和char str的区别
19 0
|
1天前
|
设计模式 API 数据格式
腾讯面试官问我适配器和桥接器的区别?
腾讯面试官问我适配器和桥接器的区别?
7 0
|
1天前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
1天前
|
Java
面试官:你知道Comparable 和 Comparator 的区别吗?我:巴拉巴拉
面试官:你知道Comparable 和 Comparator 的区别吗?我:巴拉巴拉
22 1
|
1天前
|
存储 安全 Java
Java集合篇之set,面试官:请说一说HashSet、LinkedHashSet、TreeSet的区别?
Java集合篇之set,面试官:请说一说HashSet、LinkedHashSet、TreeSet的区别?
13 0
|
1天前
|
Java
面试官:小伙子来说一说Java中final关键字,以及它和finally、finalize()有什么区别?
面试官:“小伙子,用过final关键字吗?” 我:“必须用过呀” 面试官:“好,那来说一说你对这个关键字的理解吧,再说一说它与finally、finalize()的区别” 我:“好嘞!
19 1
|
1天前
|
存储 安全 Java
面试官:请聊一聊String、StringBuilder、StringBuffer三者的区别
面试官:请聊一聊String、StringBuilder、StringBuffer三者的区别
39 8
|
1天前
|
存储 Java
面试官:素有Java锁王称号的‘StampedLock’你知道吗?我:这什么鬼?
面试官:素有Java锁王称号的‘StampedLock’你知道吗?我:这什么鬼?
43 23
|
1天前
|
存储 安全 Java
大厂面试题详解:java中有哪些类型的锁
字节跳动大厂面试题详解:java中有哪些类型的锁
67 0
|
1天前
|
消息中间件 安全 前端开发
字节面试:说说Java中的锁机制?
Java 中的锁(Locking)机制主要是为了解决多线程环境下,对共享资源并发访问时的同步和互斥控制,以确保共享资源的安全访问。 锁的作用主要体现在以下几个方面: 1. **互斥访问**:确保在任何时刻,只有一个线程能够访问特定的资源或执行特定的代码段。这防止了多个线程同时修改同一资源导致的数据不一致问题。 2. **内存可见性**:通过锁的获取和释放,可以确保在锁保护的代码块中对共享变量的修改对其他线程可见。这是因为 Java 内存模型(JMM)规定,对锁的释放会把修改过的共享变量从线程的工作内存刷新到主内存中,而获取锁时会从主内存中读取最新的共享变量值。 3. **保证原子性**:锁
16 1