我有一个 VARCHAR(4) 列,它从可能超过 4 个字符的输入接收数据。不过,这没关系,我让 MySQL 自然地(或者我是这么认为的)切断字符的结尾。
奇怪的是,当我稍后在 PHP 中查看数据库行结果(使用 PDO 驱动程序)时,会显示整个字符串,而不仅仅是 4 个字符。
奇怪的是,如果我在 MySQL CLI 上执行 SELECT 查询,它只返回 4 个字符。即使我执行 mysqldump,也只显示 4 个字符。
知道什么可能导致这种奇怪的不一致吗?
请注意,这些字符都是数字。
编辑:根据请求,这里有一些代表保存/获取方法的伪代码:
Storing:
$data = array(
'name_first4' => $fields['num'],
// name_first4 is the column name with VARCHAR(4)
);
$where = $this->getTable()->getAdapter()->quoteInto('id = ?', $id);
$this->getTable()->update($data,$where);
使用 Zend_Db_Table 获取:
$row = $this->getTable()->fetchRow(
$this->getTable()->select()->where('id=?',$data)
);
如果你这样做:
- 创建或加载对象
$o
.
- Assign
'12345'
到有问题的属性/列。
- Save
$o
并让 MySQL 将值截断为'1234'
.
- 访问属性/列
$o
并得到'12345'
back.
那么您就会看到让数据库默默地破坏数据的问题之一。
保存成功,你的对象不知道MySQL已经截断了数据,所以它保留了'12345'
而不是从数据库中重新加载该列,并且您手上的数据不一致。
如果您依赖 MySQL 默默地截断您的数据,那么您可能必须这样做:
- 创建/加载您的对象。
- 更新了属性。
- 保存对象。
- 丢弃对该对象的本地引用。
- 从数据库中加载它以确保您获得real values.
我建议为您的对象添加严格的验证,以避免 MySQL 内部的静默截断。正在开启严格模式 http://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html#sqlmode_strict_all_tables也可以避免这个问题,但随后您需要检查并加强所有错误处理和数据验证(这并不是一件坏事)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)