2010-09-24 2 views
1

У меня недавно была ошибка, которая для меня несколько странная. Давайте рассмотрим, что у нас есть таблица со столбцом FLOAT (8, 3). Давайте также рассмотрим, что у нас есть проверенный редактор таблиц, доступный через веб-браузер. Редактор таблицы поддерживает на сторону клиента проверку для каждого столбца, и не позволяет ставить поплавки, которые не в пределах указанного типа столбца, используя простое JavaScript регулярных выражений, например:MySQL JDBC driver & FLOAT (N, M) тип столбца

var rx = new RegExp("^\\d{1," + (total - precision) + "}(\\.\\d{1," + precision + "})?$"); 

, представляющие просто:

^\d{1,5}(\.\d{1,3})?$ 

для FLOAT (8, 3). Пользователь может легко ввести 99999.999 в эту ячейку, и когда он сохраняет изменения, он получает 100 000 в ячейке - потерянное значение, которое недопустимо для ограничения столбца таблицы. Я пытался расширить регулярное выражение validator для передачи 100000, но это значение не может быть сохранено в БД. Wow ... Ожидалось из-за «Вне значения диапазона для столбца« COLUMN »в строке N», но я не ожидал, что консоль MySQL (не отображает предупреждение), а SQLyog (показывает предупреждение) будет позволяют следующий UPDATE запрос:

UPDATE TABLE SET COLUMN = 100000; /* No matter it's out of range for FLOAT(8, 3), it's trimmed but not via JDBC MySQL driver*/ 

Очевидно, что это MySQL разъем конкретный вопрос. Является ли это ошибкой соединителя MySQL (в настоящее время я использую mysql-connector-java-5.1.12-bin.jar)? Или есть ли какие-либо быстрые методы, позволяющие установить 100000 (в идеале максимальное значение), обрезанные или скорректированные драйвером JDBC?

Заранее спасибо.

ответ

1

Похоже, вы сожжены округлением.

Что произойдет, если вы сделаете стол 9-3 или 10,3 таблицы вместо 8,3? Не изменяйте код проверки, а только столбец def.

Можете ли вы использовать целочисленный столбец с предполагаемой десятичной точкой? То есть 1 будет храниться как 1000. 3.221 будет храниться как 3221. Вам нужно было бы знать, чтобы разделить на 1000, прежде чем отображать номер.

Описание Обсуждение problems with MySQL Float.

+0

Благодарим за внимание. Да, это проблема округления. К сожалению, я не могу изменить определение таблицы на данный момент, но я уверен, что 100000 будет передано в этом случае, потому что оно находится в диапазоне FLOAT (9,3). Кроме того, я не могу изменить тип столбца на целое число, особенно, если учесть позицию десятичной точки. Лучший способ, который я могу предложить теперь решить проблему, - это изменить поведение драйвера JDBC MySQL каким-то образом, чтобы заставить обрабатывать запросы, такие как драйвер, используемый консолью MySQL. И я не знаю, как ... –

+0

Хорошо, можете ли вы добавить новый столбец с более дружественным типом, заполнить его из первого столбца и использовать новый столбец? Более рискованно, но, вероятно, менее рискованно, чем изменение драйвера. Или, можете ли вы определить, существует ли небольшое подмножество значений, которые действуют некорректно и взломать ваши DAO, чтобы вернуть правильное значение в этих случаях? Я уверен, что у людей MySQL есть (несвободная) служба поддержки. Возможно, они могут помочь. –

+0

У меня были такие же мысли о хаках, но они все еще взломаны, и может потребоваться больше времени для реализации и выполнения, потому что я всегда должен заботиться о правильных значениях N и M, взятых из базы данных, поскольку мы используем различные FLOAT (N, M) там. –

Смежные вопросы