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

#php #mysql #zend-db-table

#php #mysql #zend-db-table

Вопрос:

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

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

Странно то, что если я выполняю запрос SELECT в командной строке MySQL, он возвращает только 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. Вы имеете в виду, что в этом столбце может храниться более 4 символов? Сколько? 5? 10? 12? 250?

2. Можете ли вы опубликовать пример кода, который хранит значения, и кода, который извлекает их из базы данных?

3. ypercube3: варьируется, но обычно от 5 до 20 в большинстве случаев

4. Итак, если вы попытаетесь сохранить строку из 100 , будет сохранено только 20?

Ответ №1:

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

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

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

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

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

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

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

Комментарии:

1. Хах, да. Сохранял данные и извлекал данные из сеанса для того, на что я на самом деле смотрел. Вышел из системы и снова вошел в систему, и это все исправило. Добавьте substr() в метод сохранения, чтобы предотвратить повторение этого.