暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql中varchar(n)中的n表示字符还是字节

原创 小柠檬 2025-02-27
209

在 MySQL 中,VARCHAR(n) 中的 n 表示字符数(characters),而非字节数(bytes)。不过,实际存储时占用的磁盘空间会根据字符集(Charset)的编码规则动态计算(每个字符可能占用 1~4 字节)。以下是详细解释:


1. n 的定义

  • VARCHAR(n) 中的 n 表示该字段最多可以存储 n 个字符(如字母、数字、汉字、表情符号等)。

  • 示例

    sql

    复制

    -- 定义一个字段,最多存储 100 个字符(无论使用何种字符集)
    CREATE TABLE example (
        name VARCHAR(100) CHARSET utf8mb4
    );

2. 存储空间的动态计算

虽然 n 是字符数,但实际占用的存储空间由以下公式决定:

存储空间=实际字符数×字符集单字符最大字节数+长度标识开销(1或2字节)存储空间=实际字符数×字符集单字符最大字节数+长度标识开销(1或2字节)
  • 字符集的影响

    • latin1:1 字节/字符 → 存储 100 个字符需要 100×1 + 1 = 101 字节(长度 ≤255 时用 1 字节标识)。

    • utf8mb4:最多 4 字节/字符 → 存储 100 个字符最多需要 100×4 + 2 = 402 字节(长度 >255 时用 2 字节标识)。


3. 关键区别:n 是字符数 vs 字节限制

概念说明
n(定义)用户定义的字符数,与字符集无关(如 VARCHAR(100) 始终允许 100 个字符)。
存储空间(实际)由字符集决定,可能超过 n 字节(如 utf8mb4 下 100 字符最多占 400 字节)。
行大小限制所有字段的总存储空间(含长度标识)不得超过 65,535 字节

4. 常见场景示例

场景 1:单字节字符集(如 latin1

sql

复制

CREATE TABLE latin1_table (
    col1 VARCHAR(65533) CHARSET latin1  -- 最多存储 65533 字符
);
  • 计算65533 字符 × 1 字节/字符 + 2 字节长度标识 = 65535 字节(正好达到行大小限制)。

场景 2:多字节字符集(如 utf8mb4

sql

复制

CREATE TABLE utf8mb4_table (
    col1 VARCHAR(16383) CHARSET utf8mb4  -- 最多存储 16383 字符
);
  • 计算16383 字符 × 4 字节/字符 + 2 字节长度标识 = 65534 字节(接近行大小限制)。


5. 设计时的注意事项

  1. 字符集选择

    • 如果不需要存储表情符号或生僻字,优先使用 utf8(3 字节/字符)而非 utf8mb4(4 字节/字符)。

    • 对于纯英文内容,可使用 latin1 以节省空间。

  2. 行溢出风险

    sql

    复制

    -- 错误示例:总行大小超过 65,535 字节
    CREATE TABLE overflow_table (
        col1 VARCHAR(30000) CHARSET utf8mb4,
        col2 VARCHAR(30000) CHARSET utf8mb4
    );
    • 计算30000×4 + 30000×4 + 2 + 2 = 240,004 字节 → 直接报错。

  3. 字段拆分

    • 如果单表字段总长度可能溢出,需拆分成多个表或使用 TEXT 类型(但 TEXT 有额外开销)。


6. 与其他数据库的对比

数据库VARCHAR(n) 定义存储单位备注
MySQLVARCHAR(n)字符数存储空间动态计算,受字符集影响。
PostgreSQLVARCHAR(n)字符数类似 MySQL,但无行大小限制。
SQL ServerVARCHAR(n)字节数n 直接表示字节数(需手动计算字符数)。

总结

  • VARCHAR(n) 中的 n 是字符数,允许存储的字符数量与字符集无关。

  • 实际存储空间由字符集决定,需确保总行大小不超过 65,535 字节

  • 设计表时,需综合考虑字符集、字段长度和行大小限制,避免溢出。


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论