Оператор INSERT INTO автоматически добавляет разделители тысяч к целому числу Java, начиная с 1000k

Столкнулся со странной проблемой:

У меня есть столбец «MaxDealtDamage», который, например, ниже 1000000 (1000 тыс.). код такой:

class xyz = PlayerData.GetData(player);
xyz.LoginTimes++;
PlayerData.SetData(xyz, player);

Когда это 1000000 (1000k) или выше, эта ошибка отправляется:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '.000, MaxDefense = 0 WHERE UUID='d839d1f0-ad5b-4922-841c-1d6ee05d9f56'' at line 1

Он ведет себя так, как будто пытается дать ему строку, содержащую «4.000.000», но это целое число со значением «4000000» (4000k). Чтобы убедиться, что вывод во время выполнения равен 4000000, я перепроверил его.

Здесь запрос:

MessageFormat.format("INSERT INTO PlayerData(UUID,VIPExpirationDate,IPv4,FirstPlayTime,LastPlayTime,TotalPlayTime,TotalLogins,MaxDealtDamage,MaxDefense) " + "VALUES(''{0}'',''{1}'',''{2}'',''{3}'',''{4}'',{5},{6},{7},{8});", data.UUID.toString(), DBDateFormat.format(data.VIPExpirationDate), data.IPv4, DBDateFormat.format(data.FirstPlayTime), DBDateFormat.format(data.LastPlayTime), data.TotalPlayTime, data.TotalLogins, data.MaxDealtDamage, data.MaxDefense);

Вопросы, требующие помощи в отладке («почему этот код не работает?»), должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для его воспроизведения в самом вопросе. Вопросы без четкой формулировки проблемы бесполезны для других читателей. См.: Как создать минимальный, полный и проверяемый пример.

Joe C 22.01.2019 22:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

MessageFormat не является инструментом для создания операторов SQL. Это простая утилита для создания текстовых сообщений с правильным форматированием.

Вы должны использовать PreparedStatement с параметрами привязки, как описано в руководстве по Использование подготовленных операторов. JDBC позаботится об экранировании и форматировании предоставленных значений, чтобы они могли быть получены сервером базы данных, предотвращая при этом SQL-инъекции.

Спасибо за ответ, я должен был подумать о том, что MessageFormat предназначен только для построения текст.

Quantum 22.01.2019 22:19

Сработало очень хорошо, а работы еще меньше, спасибо! :)

Quantum 22.01.2019 22:37

@Quantum и безопасен, пожалуйста, прочитайте об атаке SQL Injection

Karol Dowbecki 22.01.2019 22:37

Вы правы, потому что это также делает побег, насколько я читал.

Quantum 22.01.2019 22:39

Другие вопросы по теме