SQL中CAST函数的目标类型是否标准化?各数据库类型差异问询
关于ANSI标准
CAST(expression AS type)函数的类型疑问解答 Let's break down your questions about this ANSI-standard SQL function clearly and practically:
1. 目标类型是否标准化?
ANSI SQL确实定义了一套基础标准目标类型,这些是符合标准的数据库都应当支持的核心类型。不过,标准也给数据库厂商留了扩展权限,允许他们添加自定义的非标准类型,所以实际落地时不同数据库会存在差异。
2. 允许使用哪些类型?
标准规定的核心类型
- 字符串类:
CHAR(n),VARCHAR(n),TEXT(部分ANSI版本纳入) - 数值类:
SMALLINT,INT(或INTEGER),BIGINT,DECIMAL(p,s),FLOAT,REAL - 日期时间类:
DATE,TIME,TIMESTAMP,INTERVAL
厂商扩展的非标准类型
各个数据库厂商会基于标准扩展自己的专属类型,比如MySQL的SIGNED/UNSIGNED,PostgreSQL的JSONB,SQL Server的NVARCHAR,Oracle的VARCHAR2等,这些类型仅在对应数据库中生效。
3. 不同数据库之间的类型差异?
最典型的差异体现在数值类型的处理上:
- MySQL:独有的支持
SIGNED和UNSIGNED作为CAST的目标类型,用来显式指定整数的符号属性,例如CAST(-456 AS UNSIGNED)会按照MySQL规则将负数转换为无符号整数。 - PostgreSQL、SQL Server、Oracle等主流数据库:不支持
SIGNED/UNSIGNED这种写法,统一使用标准的INT、BIGINT等数值类型。如果需要实现无符号整数的效果,通常需要借助DECIMAL类型或者数据库特定的约束来实现。
除此之外,字符串、日期时间类型也存在细节差异,比如SQL Server的NVARCHAR对应标准的Unicode字符串类型,而Oracle则用VARCHAR2作为主要的可变长度字符串类型。
内容的提问来源于stack exchange,提问作者eastwater
相关产品推荐
相关产品推荐

