Oracle、MySQL、PostGreSQL、SQL Server- VARCHAR与VARCHAR2
Oracle 数据库中的 varchar 和 varchar2 数据类型都用于存储字母数字值的动态长度,也是最常用的字段数据类型。它们之间存在一些差异。
varchar 数据类型是适用于所有关系数据库产品(Oracle、MySQL、PostgreSQL 和等)的 ANSI 标准数据类型,存储长度不同数据库差异较大。
而 varchar2 数据类型是 Oracle 标准数据类型,仅适用于 Oracle 数据库,它最多可存储 4000 个字节, 12c后新特性已经4,000增长32,767 bytes.Oracle 7.0 引入了 varchar2 数据类型,Varchar2 不区分 NULL 和空字符串,而且永远不会。如果你依赖空字符串和 NULL 是同一个东西,你应该使用 varchar2。VARCHAR是Varchar2的同义词,当我们创建 varchar 数据类型时,Oracle 服务器会在内部自动将 varchar 数据类型转换为 varchar2 数据类型。而部分国产库是VARCHAR2是VARCHAR的同义词。
可见Oracle已经用varchar2替换了varchar, 那在国产化数据库推进过程中,大量应用从Oracle迁移,希望可以兼容oracle, 挑了2个测试一下效果怎么样。
长度上限
-- PostgreSQL
weejar=# create table test(id int,name varchar(65536000));
错误: 类型 varchar 的长度不能超过 10485760
第1行create table test(id int,name varchar(65536000));
-- MySQL
mysql> create table test1321(id int,name varchar(80000));
ERROR 1074 (42000): Column length too big for column 'name' (max = 16383); use BLOB or TEXT instead
-- Oracle 19.3
SQL> create table test1341(id int,name varchar(32769 byte));
create table test1341(id int,name varchar(32769 byte))
*
ERROR at line 1:
ORA-00910: specified length too long for its datatype
SQL> ho oerr ora 910
00910, 00000, "specified length too long for its datatype"
// *Cause: for datatypes CHAR and RAW, the length specified was > 2000;
// otherwise, the length specified was > 4000.
// *Action: use a shorter length or switch to a datatype permitting a
// longer length such as a VARCHAR2, LONG CHAR, or LONG RAW
Note:
当然长度不是判断数据库好坏的标准,会有其它类型补充。
ORACLE
SQL> create table test(id int,name varchar2(20));
Table created.
SQL> desc test
Name Null? Type
------------------------------- -------- ----------------------------
1 ID NUMBER(38)
2 NAME VARCHAR2(20)
SQL> create table test1(id int,name varchar(20));
Table created.
SQL> desc test1
Name Null? Type
------------------------------- -------- ----------------------------
1 ID NUMBER(38)
2 NAME VARCHAR2(20)
SQL> insert into test1 values(