【SQL】varchar 与 char 的区别

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

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 创建表并插入数据的示例,分别展示 CHAR 和 VARCHAR 类型的用法:

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();
        }
    }
}

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

总结

  • CHAR: 固定长度,适合存储长度固定的字符串,性能较好。
  • VARCHAR: 可变长度,适合存储长度不固定的字符串,灵活性更高。
相关推荐
gb42152871 小时前
向量数据库多模态特性
数据库
泡海椒1 小时前
数据占比展示:jquick-pdf饼图动态数据渲染PDF教程
数据库·oracle·pdf
大连好光景1 小时前
向量数据库的工作流程详解
数据库·milvus
catchadmin2 小时前
用 Jev 与 Laravel AI SDK 检测垃圾邮件和自动回复
数据库·人工智能·laravel
吠品3 小时前
CSS图片模糊过渡:一个transition加filter就够
java·数据库·notepad++
梦想不只是梦与想4 小时前
对象存储服务器vs数据库
数据库·对象存储·图片存储
火柴就是我4 小时前
Flutter 项目本地 Maven 引入 AAR 找不到?一次 Gradle 路径问题排查
android
Ivanqhz4 小时前
正余弦位置编码(Sinusoidal Positional Encoding)
java·linux·数据库
Ivanqhz4 小时前
层归一化、残差、前馈网络与激活函数简述
服务器·数据库·人工智能·深度学习·算法
火柴就是我4 小时前
Android 打包报错 25.0.3
android·前端