【SQL】varchar 与 char 的区别

在 SQL 中,VARCHARCHAR 是用于存储字符串类型数据的两种数据类型,但它们在存储方式和性能上有显著的区别。

CHAR

  • 定义 : CHAR 是一种固定长度的字符串数据类型。
  • 长度 : 你需要在定义表结构时指定长度,例如 CHAR(10)
  • 存储方式: 无论实际存储的字符串长度是多少,都会占用固定的长度。如果存储的字符串长度小于指定长度,剩余的部分会用空格填充。
  • 性能 : 由于是固定长度,在处理数据时性能通常比 VARCHAR 要快。
  • 适用场景: 适用于长度固定的字符串,如国家代码、身份证号等。
sql 复制代码
CREATE TABLE example_char (
    id INT,
    code CHAR(10)
);

VARCHAR

  • 定义 : VARCHAR 是一种可变长度的字符串数据类型。
  • 长度 : 你需要在定义表结构时指定最大长度,例如 VARCHAR(50)
  • 存储方式: 只存储实际的字符串长度,加上额外的字节用于存储字符串的长度信息。
  • 性能 : 由于是可变长度,处理数据时需要额外的开销来计算实际长度,性能通常比 CHAR 稍慢。
  • 适用场景: 适用于长度不固定的字符串,如姓名、地址等。
sql 复制代码
CREATE TABLE example_varchar (
    id INT,
    description VARCHAR(255)
);

示例代码

下面是一个使用 JDBC 创建表并插入数据的示例,分别展示 CHARVARCHAR 类型的用法:

java 复制代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class CharVarcharExample {
    private static final String JDBC_URL = "jdbc:mysql://localhost:3306/yourdatabase";
    private static final String JDBC_USER = "yourusername";
    private static final String JDBC_PASSWORD = "yourpassword";

    public static void main(String[] args) {
        try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
             Statement stmt = conn.createStatement()) {

            // 创建使用 CHAR 的表
            String createTableCharSQL = "CREATE TABLE IF NOT EXISTS example_char (" +
                                        "id INT AUTO_INCREMENT PRIMARY KEY," +
                                        "code CHAR(10))";
            stmt.executeUpdate(createTableCharSQL);
            System.out.println("Table with CHAR created.");

            // 插入数据到使用 CHAR 的表
            String insertCharSQL = "INSERT INTO example_char (code) VALUES ('ABC'), ('12345'), ('A')";
            stmt.executeUpdate(insertCharSQL);
            System.out.println("Data inserted into table with CHAR.");

            // 查询数据
            ResultSet rsChar = stmt.executeQuery("SELECT id, code FROM example_char");
            System.out.println("Data from table with CHAR:");
            while (rsChar.next()) {
                int id = rsChar.getInt("id");
                String code = rsChar.getString("code");
                System.out.println("ID: " + id + ", Code: '" + code + "'");
            }

            // 创建使用 VARCHAR 的表
            String createTableVarcharSQL = "CREATE TABLE IF NOT EXISTS example_varchar (" +
                                           "id INT AUTO_INCREMENT PRIMARY KEY," +
                                           "description VARCHAR(255))";
            stmt.executeUpdate(createTableVarcharSQL);
            System.out.println("Table with VARCHAR created.");

            // 插入数据到使用 VARCHAR 的表
            String insertVarcharSQL = "INSERT INTO example_varchar (description) VALUES ('Alice'), ('Bob'), ('Charlie')";
            stmt.executeUpdate(insertVarcharSQL);
            System.out.println("Data inserted into table with VARCHAR.");

            // 查询数据
            ResultSet rsVarchar = stmt.executeQuery("SELECT id, description FROM example_varchar");
            System.out.println("Data from table with VARCHAR:");
            while (rsVarchar.next()) {
                int id = rsVarchar.getInt("id");
                String description = rsVarchar.getString("description");
                System.out.println("ID: " + id + ", Description: '" + description + "'");
            }

            // 清理示例数据
            stmt.executeUpdate("DROP TABLE IF EXISTS example_char");
            stmt.executeUpdate("DROP TABLE IF EXISTS example_varchar");

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,展示了如何使用 CHARVARCHAR 创建表并插入数据。请根据需要调整数据库连接字符串、用户名、密码和 SQL 语句。

总结

  • CHAR: 固定长度,适合存储长度固定的字符串,性能较好。
  • VARCHAR: 可变长度,适合存储长度不固定的字符串,灵活性更高。
相关推荐
Treh UNFO1 分钟前
nginx的重定向
大数据·数据库·nginx
TechMix4 分钟前
【fkw学习笔记】Android 13 AOSP 源码添加系统预置应用实战指南
android·笔记·学习
jvvz afqh8 分钟前
mysql用户名怎么看
数据库·mysql
云起SAAS9 分钟前
私域直播系统UniApp源码 多商户商城+直播带货 微信小程序+H5+安卓iOS
android·微信小程序·uni-app·私域直播系统
eDEs OLDE12 分钟前
CC++链接数据库(MySQL)超级详细指南
c语言·数据库·c++
EXnf1SbYK13 分钟前
Redis分布式锁进阶第八篇:锁超时乱序深度踩坑 + 看门狗失效真实溯源 + 业务长耗时标准化兜底方案
数据库·redis·分布式
EXnf1SbYK22 分钟前
Redis分布式锁进阶第十一篇
数据库·redis·分布式
xiaohe0728 分钟前
C#数据库操作系列---SqlSugar完结篇
网络·数据库·c#
冬奇Lab32 分钟前
RAG 系列(六):向量数据库——存储与检索的基础设施
数据库·人工智能·llm
vooy pktc32 分钟前
macOS安装Redis
数据库·redis·macos