VARCHAR (4) хранит больше символов, чем четыре

У меня есть столбец VARCHAR (4), который получает данные от ввода, который может быть выше 4 символов. Это нормально, и я позволил MySQL естественно (или так я думал) отрезать конец символов.

Как ни странно, когда я просматриваю результаты строки базы данных позже в PHP (используя драйвер PDO), отображается вся строка, а не только 4 символа.

Что странно, если я делаю запрос SELECT в MySQL CLI, он возвращает только 4 символа. Даже когда я делаю mysqldump, отображаются только 4 символа.

Любая идея, что может вызвать эту странную несогласованность?

Обратите внимание, что эти символы – все числа.

Изменить: по запросу, вот какой psuedocode, который представляет методы 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) ); 

Related of "VARCHAR (4) хранит больше символов, чем четыре"

Если вы это делаете:

  1. Создайте или загрузите объект $o .
  2. Присвойте '12345' соответствующему свойству / столбцу.
  3. Сохраните $o и позвольте MySQL усекать значение до '1234' .
  4. Откройте свойство / столбец в $o и получите '12345' назад.

то вы видите одну из проблем, позволяющих вашей базе данных беззвучно калечить ваши данные.

Сохранение выполнено успешно, ваш объект не знает, что MySQL усекает данные, поэтому он поддерживает '12345' а не перезагружает этот столбец из базы данных, и у вас есть непоследовательные данные на ваших руках.

Если вы зависите от MySQL, тихо усекая ваши данные, вам, вероятно, придется это сделать:

  1. Создайте / загрузите свой объект.
  2. Обновлены свойства.
  3. Сохраните объект.
  4. Отбросьте локальную ссылку на объект.
  5. Загрузите его из базы данных, чтобы получить реальные значения.

Я бы рекомендовал добавлять строгие проверки к вашим объектам, чтобы избежать молчаливого усечения внутри MySQL. Включение строгого режима также позволит избежать этой проблемы, но тогда вам нужно будет рассмотреть и затянуть всю обработку ошибок и проверку данных (что не было бы очень плохо).