如何强制openSUSE 15.3中Perl查询MySQL返回字符串而非整数
问题原因
这个行为差异是DBD::mysql驱动版本更新导致的:4.041及以上版本的DBD::mysql默认开启了自动类型映射功能,会根据MySQL表的字段类型自动将数值类字段的查询结果转为Perl数值类型,而旧版本的DBD::mysql默认将所有查询结果统一返回为字符串类型。
解决方案
针对你有大量存量脚本的场景,优先选择无需修改业务逻辑的方案:
方案1:修改数据库连接参数(单脚本生效)
在数据库连接的DSN中新增mysql_enable_types=0参数,即可关闭当前连接的自动类型映射,所有查询结果将和旧版本一样返回字符串类型:
# 修改前的连接代码 # $dbh = DBI->connect('DBI:mysql:database', 'user', 'password') or die "Can't connect to MySQL"; # 修改后的连接代码 $dbh = DBI->connect('DBI:mysql:database;mysql_enable_types=0', 'user', 'password') or die "Can't connect to MySQL";
方案2:设置全局环境变量(所有脚本生效)
如果不想逐个修改存量脚本的连接代码,可以在系统层面或者脚本启动前设置环境变量DBD_MYSQL_ENABLE_TYPES=0,该配置会全局作用于所有使用DBD::mysql的Perl脚本:
# 临时生效测试,执行脚本前先运行该命令 export DBD_MYSQL_ENABLE_TYPES=0 # 永久生效可以将以上命令写入 /etc/profile 或者对应服务的启动配置中
方案3:单字段强制转字符串(个别场景适用)
如果只需要调整个别查询的返回类型,可以在取值时拼接空字符串强制转为字符串类型:
$OdL_ID = $dbh->selectrow_array($sql) . '';
验证
修改配置后再次运行你的测试代码,Data::Dumper的输出将和旧SLES系统一致,返回带引号的字符串类型结果:
$VAR1 = '386379';
内容的提问来源于stack exchange,提问作者mrezzonico
相关产品推荐
相关产品推荐

