【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: 可变长度,适合存储长度不固定的字符串,灵活性更高。
相关推荐
程序员码歌1 天前
短思考第269天,想清楚这些,短文写作,人人都可以
android·前端·ai编程
阿猿收手吧!1 天前
【MySQL】ORM与ODB:数据库编程技术大比拼
数据库·mysql
一只专注api接口开发的技术猿1 天前
从原理到实现:淘宝商品详情 API 的数据结构与调用机制剖析
大数据·数据结构·数据库·架构
+VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue民宿平台管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
怎么就重名了1 天前
Kivy的属性系统
java·前端·数据库
编程饭碗1 天前
【Spring全局异常处理 早抛晚捕】
java·数据库·spring
langsiming1 天前
Redis底层实现
数据库·redis·缓存
Digitally1 天前
如何将通话记录从Android传输到Android
android
Hello World呀1 天前
Redis是AP的还是CP?
数据库·redis·缓存
俺不理解1 天前
Android Studio 打开项目卡在 Importing xx Gradle Project
android·ide·android studio