【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: 可变长度,适合存储长度不固定的字符串,灵活性更高。
相关推荐
泡沫·12 分钟前
5.MariaDB数据库管理
数据库·mariadb
i***512614 分钟前
【数据库】MySQL的安装与卸载
数据库·mysql·adb
7***318815 分钟前
若依微服务中配置 MySQL + DM 多数据源
android·mysql·微服务
我是好小孩21 分钟前
【Android】常见的架构模式:MVC, MCP, MVVM
android·架构·mvc
Digitally25 分钟前
如何通过蓝牙将联系人从 iPhone 传输到 Android
android·ios·iphone
数白27 分钟前
Oracle 数据迁移最佳实践(不使用第三方工具)
数据库·oracle
周杰伦fans37 分钟前
C# 中的**享元工厂**模式
开发语言·数据库·c#
空空kkk1 小时前
SpringMVC——拦截器
java·数据库·spring·拦截器
J***51681 小时前
MySql中的事务、MySql事务详解、MySql隔离级别
数据库·mysql·adb
SelectDB1 小时前
Apache Doris 中的 Data Trait:性能提速 2 倍的秘密武器
数据库·后端·apache