【数据库使用】 extra_float_digits导致的double类型模糊匹配错误
【摘要】 问题背景:select * from schema.tablename where double::text like '%114.0061705';查询结果为空,但实际有符合条件的数据。根因:double类型的数值,在进行模糊查询时,由于extra_float_digits导致精度不一致,结果集出现误差。 extra_float_digits参数说明:调整浮点值显示的数据位数,浮点类型包...
问题背景:
select * from schema.tablename where double::text like '%114.0061705';
查询结果为空,但实际有符合条件的数据。
根因:
double类型的数值,在进行模糊查询时,由于extra_float_digits导致精度不一致,结果集出现误差。
extra_float_digits
参数说明:调整浮点值显示的数据位数,浮点类型包括float4、float8 以及几何数据类型。参数值加在标准的数据位数上(FLT_DIG或DBL_DIG中合适的)。
参数类型:USERSET
取值范围:整型,-15~3
说明:
- 设置为3,表示包括部分有效的数据位。对转储需要精确恢复的浮点数据尤其有用。
- 设置为负数,表示摒弃不需要的数据位。
默认值:0
通过JDBC进行连接DWS时,需要注意。
连接参数
第三方工具通过JDBC连接时,JDBC向DWS发起连接请求,会默认添加以下配置参数,详见JDBC代码ConnectionFactoryImpl类的实现。
params = {
{ "user", user },
{ "database", database },
{ "client_encoding", "UTF8" },
{ "DateStyle", "ISO" },
{ "extra_float_digits", "3" },
{ "TimeZone", createPostgresTimeZone() },
};
这些参数可能会导致JDBC客户端的行为与gsql客户端的行为不一致,例如,Date数据显示方式、浮点数精度表示、timezone显示。
如果实际期望和这些配置不符,建议在java连接设置代码中显式设定这些参数。
通过JDBC连接数据库时,会设置extra_float_digits=3,DWS中设置为extra_float_digits=0,可能会造成同一条数据在JDBC显示和gsql显示的精度不同。
对于精度敏感的场景,建议使用numeric类型。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)