我有一个VARCHAR(4)列,它接收来自输入的数据,该输入可能超过4个字符.不过,这是可以的,我让MySQL自然地(或者我认为)切断了角色的结尾.
奇怪的是,当我稍后在PHP(使用PDO驱动程序)中查看数据库行结果时,整个字符串正在显示,而不仅仅是4个字符.
奇怪的是,如果我在MySQL CLI上执行SELECT查询,它只返回4个字符.即使我做了一个mysqldump,也只显示了4个字符.
知道什么可能导致这种奇怪的不一致吗?
请注意,这些字符都是数字.
编辑:根据请求,这里有一些代表save / fetch方法的伪代码:
储存:
$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.
>将“12345”分配给相关的属性/列.
>保存$o并让MySQL将值截断为’1234′.
>访问$o中的属性/列并返回’12345′.
然后你会看到让数据库静默地破坏你的数据的一个问题.
保存成功,您的对象不知道MySQL已截断数据,因此它保持“12345”而不是从数据库重新加载该列,并且您手上的数据不一致.
如果您依赖MySQL默默地截断您的数据,那么您可能必须这样做:
>创建/加载对象.
>更新了属性.
>保存对象.
>丢弃对该对象的本地引用.
>从数据库中重新加载它以确保获得真实值.
我建议为对象添加严格的验证,以避免MySQL内部的静默截断.打开strict mode也可以避免这个问题,但是你需要检查并收紧所有的错误处理和数据验证(这不会是一件坏事).
标签:php,mysql,zend-db-table 来源: https://codeday.me/bug/20190721/1494917.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。