PostgreSQL 12 INT字段接受CHAR值,隐式类型转换是否为MySQL、SQL Server标准
关系型数据库隐式类型转换特性说明
你观测到的PostgreSQL中INT字段可接受合法数字字符串的隐式转换特性,不属于跨数据库的通用标准,MySQL、SQL Server的相关实现规则和PostgreSQL有明显差异:
- PostgreSQL默认对数字类字段和合法数字格式字符串的转换非常宽松,只要字符串内容可以被正确解析为对应数值类型,就会自动完成转换写入,仅当字符串存在无法解析的非数字字符时才会抛出类型错误。
- MySQL的隐式转换行为由SQL模式决定:默认非严格模式下支持和PostgreSQL类似的字符串转数字的隐式转换,写入不会报错;如果开启严格模式(
sql_mode参数配置包含STRICT_TRANS_TABLES或STRICT_ALL_TABLES),这类类型不匹配的写入会直接抛出错误。 - SQL Server对隐式转换的限制最严格,默认场景下给INT字段传递CHAR/VARCHAR类型的数字值会直接抛出类型转换失败的错误,不会自动完成隐式转换。
不管使用哪款数据库,都不建议依赖隐式转换特性编写SQL,原因如下:
- 隐式转换会导致查询时无法命中对应字段的索引,大幅降低SQL执行效率
- 不同数据库的转换规则差异极大,依赖隐式转换的SQL可移植性极差,迁移数据库时需要全部改造
- 当传入的字符串存在非法数字字符时,会触发不可预期的报错或者脏数据写入
针对你给出的示例代码,优化写法如下,主动匹配字段类型避免隐式转换:
insert into cars(customerid,employeeid,model,status,totalcost) values (1,2,'Ford F-150','READY',230);
内容的提问来源于stack exchange,提问作者Tapan Das
相关产品推荐
相关产品推荐

