当我使用ZF包装器运行SQL查询时,所有数值都以字符串形式返回。 我需要更改什么,以便值将返回与数据库中相同的数据类型?
当我使用ZF包装器运行SQL查询时,所有数值都以字符串形式返回。 我需要更改什么,以便值将返回与数据库中相同的数据类型?
我实施了很多 Zend_Db Zend Framework中的代码。
正如其他人所说,之所以如此 Zend_Db 返回字符串而不是本机PHP整数或浮点数是PHP的数据库扩展返回字符串。原因是可能没有本机PHP类型来表示某种数据库类型。
例如,MySQL的 BIGINT 是一个64位有符号整数。默认情况下,PHP int type限制为32位值,因此如果从数据库中获取数据并将其隐式转换为 int,某些值可能会被截断。还有其他几个类似的案例 float 和日期等
对所有数据类型使用字符串表示是保持简单和一致的最佳方法,可以安全地避免数据丢失,并避免编写大量特定于供应商的特殊情况代码来执行数据类型映射。额外的代码也会导致性能下降。
因此,如果您需要将数据库结果映射到本机PHP数据类型的特定情况,则应在应用程序代码中自行实现(例如,在自定义中) Zend_Db_Table_Row 类)。
数据库通常将结果集作为文本返回。除非您的数据库适配器为您转换内容(并且听起来与您的相似),否则所有值都将以字符串形式返回 - 日期,枚举等以及整数。
如果您只使用几个整数字段处理少量表,只需手动转换它们即可。如果处理稍微复杂的情况,可以使用数据库定义迭代列(请参阅 sqlite_fetch_column_types()等)。如果您的情况比这些解决方案看起来更合理,请考虑切换到更具特色的框架。
似乎过去曾要求这样做,但尚未实施。 #ZF-300 最后一次评论于09年1月9日。
也许你可以分享为什么你想要进行类型转换,我们可以用另一种方式帮助你?对于可变数据类型,PHP非常宽松......
有关使用自定义的示例 Zend_Db_Table_Row 如Bill Karwin建议的那样,要获得正确的数据类型,请查看此处的类: http://www.zfsnippets.com/snippets/view/id/70
它可以在您的模型中实现为:
class YourTableName extends Zend_Db_Table_Abstract
{
protected $_name = 'your_table_name';
protected $_rowClass = 'Model_Row_Abstract';
}
你可能想要改变 Model_Row_Abstract的数据类型为 tinyint 至 bool 如果你严格使用它来保持布尔值。