汇总
数据库 | 最大长度 | 是否可以不设置长度 | 不设长度时默认最大长度 |
---|---|---|---|
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
在使用 utf8 字符集时,每个字符可能占用 3 个字节,varchar 最大长度为 21845 个字符左右(因为65535 / 3 = 21845)。
若字符集是 utf8mb4,每个字符可能占用 4 个字节,所以最大长度会进一步减少到 16383 个字符左右(65535 / 4 ≈ 16383)。
需要注意的是,对于 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;
varchar
和 varchar2
的区别
- 存储空间
在 Oracle 7 及以下版本中,VARCHAR
类型的长度是固定的,如果存储的数据长度小于定义的长度,那么它将会在右侧填充空格。而在 Oracle 8 及以上版本中,VARCHAR
类型的长度可以动态变化,与 VARCHAR2
相同。
- 默认长度
在 Oracle 7 及以下版本中,VARCHAR
类型的默认长度为 1,而在 Oracle 8 及以上版本中,VARCHAR
类型的默认长度为 4000。VARCHAR2
类型的默认长度为 1。VARCHAR2
支持的最大长度比 VARCHAR
长(Oracle 12 版本之前为 4000 个字节,12 版本之后为 32767 字节);
- 是否允许空值
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
:最大长度为 255VARCHAR
:最大长度为 4000LONGVARCHAR
:用于保存变长的字符串数据,最大长度为 4321700GRAPHICS
:用于存储双字节字符串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,最大 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 字节