VARCHAR(4)存储多于4个字符



我有一个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. 创建或加载对象$o
  2. '12345'分配给正在讨论的属性/列。
  3. 保存$o,让MySQL截断值为'1234'
  4. 访问$o的属性/列并获得'12345'

那么你看到的问题之一是让你的数据库默默地破坏你的数据。

保存成功,你的对象不知道MySQL已经截断了数据,所以它保留了'12345',而不是从数据库中重新加载该列,你手上有不一致的数据。

如果你依赖于MySQL默默地截断你的数据,那么你可能不得不这样做:

    创建/加载你的对象
  1. 更新属性
  2. 保存对象
  3. 丢弃对对象的本地引用。
  4. 从数据库中加载它,以确保您获得真实的值。

我建议对你的对象添加严格的验证,以避免MySQL内部的静默截断。打开严格模式也可以避免这个问题,但你需要检查和收紧所有的错误处理和数据验证(这并不是一件坏事)。

最新更新