汇总

数据库

最大长度

是否可以不设置长度

不设长度时默认最大长度

MySQL

65535字节

设置值与编码有关

如果是utf8mb4,最大为65535/4

如果是utf8mb4,最大为65535/3

如果是gbk,最大为65535/2

-

Oracle

4000字节或者4000字符(varchar2(4000 char)

-

DB2

4000字节

-

PostgreSQL

10485760 字节(即 10 MB)

10485760 字节(即 10 MB)

DM(达梦)

与数据库分页有关

4K -> 1900

8K -> 3900

16K -> 8000

32k -> 8188

当前数据库分页支持的最大值,如当前数据库分页是32K,则为8188

KingBaseES

10485760 字节(即 10 MB)

10485760 字节(即 10 MB)

Oscar(神通)

8000 字符

1 字符

Informix

255 字节

1 字节

Gbase 8a

UTF8,10922 字符

UTF8MB4,8191 字符

-

caché / IRIS

由数据库配置

1 字符

Greenplum

10485760 字节(即 10 MB)

10485760 字节(即 10 MB)

SQLServer

8000 字节

1 字节

数据库不同逻辑

MySQL

如果列设置可以为空,需要额外占用 1 字符表示是否为空。

还需要占用 1~2 字节来表示长度(如果声明长度超过 255,则占用 2 字节,否则 1 字节)

所以真正可以存储数据的长度为 65535bit - 2Bit - 1bit = 65518bit

在使用 utf8 字符集时,每个字符可能占用 3 个字节,varchar 最大长度为 21845 个字符左右(因为65518 / 3 = 21839)。

若字符集是 utf8mb4,每个字符可能占用 4 个字节,所以最大长度会进一步减少到 16383 个字符左右(65535 / 4 ≈ 16379)。

需要注意的是,对于 innodb 表,主键和外键列最大长度为 3072 字节

如果表编码是 utf8,存在列 name varchar(1),那么该列就可以存一个中文字符

Oracle

在 oracle 中

  • varchar2(50 char)表示最多 50 字符

    • UTF8/GBK 一个中文占一个字符,所以最多能存 50 个汉字

  • varchar2(50)varchar2(50 byte) 表示最多 50 个字节

    • UTF8 一个中文占 3 个字节,所以最多能存 16 个汉字

    • GBK 一个中文占 2 个字节,所以最多能存 25 个汉字

VARCHAR2 支持的最大长度为 4000 字节或 4000 字符,如下

create table test (
  name1 varchar2(4000),
  name2 varchar2(4000 char)
)

扩展

查询编码

// 查询数据库编码格式
select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';
select userenv('language') from dual;

// 查看指定字符占用长度
select lengthb('啊') from dual;

varcharvarchar2 的区别

  1. 存储空间

    在 Oracle 7 及以下版本中,VARCHAR 类型的长度是固定的,如果存储的数据长度小于定义的长度,那么它将会在右侧填充空格。而在 Oracle 8 及以上版本中,VARCHAR 类型的长度可以动态变化,与 VARCHAR2 相同。

  1. 默认长度

    在 Oracle 7 及以下版本中,VARCHAR 类型的默认长度为 1,而在 Oracle 8 及以上版本中,VARCHAR 类型的默认长度为 4000。VARCHAR2 类型的默认长度为 1。VARCHAR2 支持的最大长度比 VARCHAR 长(Oracle 12 版本之前为 4000 个字节,12 版本之后为 32767 字节);

  1. 是否允许空值

    VARCHAR 对空串不处理(也就说字段没有值,可能是空字符串也可能是空值),VARCHAR2 将空串当做 NULL 来处理;

PostgreSQL

在 PostgreSQL 中,VARCHAR 类型的最大长度是 10485760 字节(即 10 MB)。但是,需要注意的是,实际可用的最大长度取决于数据库的配置和硬件限制。此外,为了确保性能和可靠性,建议将 VARCHAR 类型的长度限制在实际需要的范围内。

pg 在建表时可以不指定 varchar 列的长度,不指定长度即可用最大长度存储(10 M),如下:

create table test (
  name1 varchar(255),
  name2 varchar,
  name3 varchar(10485760)
)

DB2

  • CHAR:最大长度为255

  • VARCHAR:最大长度为4000

  • LONGVARCHAR:用于保存变长的字符串数据,最大长度为4321700

  • GRAPHICS:用于存储双字节字符串

  • VARGRAPHICS:用于存储可变长的双字节字符串

  • CLOB:最大长度为2G

这里 varchar 的长度是字节,也就是说,最大支持 4000 字节,db2 中 UTF-8 一个中文就要占 3 个字节,GBK 一个中文占 2 字节

DM(达梦)

VARCHAR2 数据类型的实际最大长度由数据库页面大小决定,在建库时指定,之后无法修改。具体最大长度算法如下表所示:

数据页大小

varchar2 最大长度

4K

1900

8K

3900

16K

8000

32K

8188

在建表时可以不指定 varchar2 类型长度,不指定则为最大长度,如下:

create table test (
  name varchar2(8188),
  name1 varchar2
)

KingBaseES

数据库底层为 pg,同 pg,最大 10485761,可以不设置,不设置就是最大

create table test (
    name varchar(100)
    name1 varchar
);

Oscar(神通)

神通数据库创建 varchar2 类型的列,其实真实还是 varchar 类型,只是为了支持这种语法,如下:

create table test (
  name varchar(4000),
  name1 varchar2(4000)
)

同样的 varchar(100 char) 也只是支持该语法,类型长度代表最大字符数

所以神通数据库 varchar 最大支持 8000 字符,可以不指定长度,默认最大长度为1,如:

create table test (
  name varchar,
  name1 varchar2(4000)
)

Informix

最大支持 255 字节,插入时如果字符串的长度大于设定的长度,不会报错,会插入一个空串

类型后面可以不跟长度,默认 1 字节,如下:

create table test (
  name varchar(255),
  name1 varchar
)

Gbase 8a

UTF8 字符集,最长 10922 字符

UTF8MB4 字符集,最长 8191 字符

caché / IRIS

varchar 的最大长度和数据库的配置有关,可以用 max 来代替设定最大长度,如果不设定长度,默认为 1,如下:

create table test(
  name varchar,
  name1 varchar(max)
)

如果设定的长度超过最大长度,长度会变成 0

Greenplum

同 pg

SQLServer

最大 8000 字节,可以不设定长度,默认为 1 字节