汇总
数据库不同逻辑
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;
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 类型长度,不指定则为最大长度,如下:
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 字节