Оператор 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: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с '.000, MaxDefense = 0, ГДЕ UUID='d839d1f0-ad5b-4922-841c-1d6ee05d9f56'' в строке 1

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

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

MessageFormat.format("ВСТАВИТЬ В PlayerData(UUID,VIPExpirationDate,IPv4,FirstPlayTime,LastPlayTime,TotalPlayTime,TotalLogins,MaxDealtDamage,MaxDefense) " + "ЗНАЧЕНИЯ(''{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);


person Quantum    schedule 22.01.2019    source источник
comment
Вопросы, требующие помощи в отладке (почему этот код не работает?), должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для ее воспроизведения, в самом вопросе. Вопросы без четкой формулировки проблемы бесполезны для других читателей. См. раздел Как создать минимальный, полный и проверяемый пример.   -  person Joe C    schedule 23.01.2019


Ответы (1)


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

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

person Karol Dowbecki    schedule 22.01.2019
comment
Спасибо за ответ, я должен был подумать о том, что MessageFormat предназначен только для создания текста. - person Quantum; 23.01.2019
comment
Сработало очень хорошо, а работы еще меньше, спасибо! :) - person Quantum; 23.01.2019
comment
@Quantum и безопасен, пожалуйста, прочитайте об атаке SQL Injection - person Karol Dowbecki; 23.01.2019
comment
Вы правы, потому что это также делает побег, насколько я читал. - person Quantum; 23.01.2019