VARCHAR(4)存储的字符数多于四个

时间:2011-11-05 22:02:20

标签: php mysql zend-db-table

我有一个VARCHAR(4)列,它接收来自输入的数据,该输入可能超过4个字符。不过,这是可以的,我让MySQL自然地(或者我认为)切断了角色的结尾。

奇怪的是,当我稍后在PHP(使用PDO驱动程序)中查看数据库行结果时,整个字符串都在显示,而不仅仅是4个字符。

奇怪的是,如果我在MySQL CLI上执行SELECT查询,它只返回4个字符。即使我做了一个mysqldump,也只显示了4个字符。

知道什么可能导致这种奇怪的不一致吗?

请注意,这些字符都是数字。

编辑:根据请求,这里有一些代表保存/获取方法的伪代码:

储存:

$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)
);

1 个答案:

答案 0 :(得分:10)

如果你这样做:

  1. 创建或加载对象$o
  2. '12345'分配给相关的媒体资源/列。
  3. 保存$o并让MySQL将值截断为'1234'
  4. 访问$o中的媒体资源/列,然后返回'12345'
  5. 然后你会看到让你的数据库无声地破坏你的数据的一个问题。

    保存成功,您的对象不知道MySQL已截断数据,因此它保留'12345'而不是从数据库重新加载该列,并且您手上的数据不一致。

    如果您依赖于MySQL默默地截断您的数据,那么您可能必须这样做:

    1. 创建/加载您的对象。
    2. 更新了属性。
    3. 保存对象。
    4. 丢弃对象的本地引用。
    5. 从数据库中重新加载它,以确保获得真实的值。
    6. 我建议为对象添加严格的验证,以避免MySQL内部的静默截断。打开strict mode也可以避免这个问题,但是你需要检查并收紧所有的错误处理和数据验证(这不会是一件坏事)。