#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:
Если ты делаешь это:
- Создайте или загрузите объект
$o
. - Присвоить
'12345'
соответствующему свойству /столбцу. - Сохраните
$o
и позвольте MySQL обрезать значение до'1234'
. - Получите доступ к свойству / колонке в
$o
и вернитесь'12345'
обратно.
тогда вы сталкиваетесь с одной из проблем, связанных с тем, что ваша база данных позволяет незаметно искажать ваши данные.
Сохранение выполнено успешно, ваш объект понятия не имеет, что MySQL обрезал данные, поэтому он сохраняет '12345'
, а не перезагружает этот столбец из базы данных, и у вас на руках противоречивые данные.
Если вы зависите от того, что MySQL автоматически обрезает ваши данные, то вам, вероятно, придется это сделать:
- Создайте / загрузите свой объект.
- Обновлены свойства.
- Сохраните объект.
- Выбросьте вашу локальную ссылку на объект.
- Загрузите его заново из базы данных, чтобы убедиться, что вы получаете реальные значения.
Я бы рекомендовал добавить строгие проверки к вашим объектам, чтобы избежать автоматического усечения внутри MySQL. Включение строгого режима также позволило бы избежать этой проблемы, но тогда вам нужно будет просмотреть и подтянуть всю обработку ошибок и проверку данных (что на самом деле было бы неплохо).
Комментарии:
1. Хах, да. Сохранял данные и извлекал данные из сеанса для того, на что я на самом деле смотрел. Вышел из системы и снова вошел в систему, и это все исправило. Добавьте substr() в метод сохранения, чтобы предотвратить повторение этого.