Оператор INSERT INTO автоматически добавляет тысячи разделителей к целому числу java, начиная с 1000k - PullRequest
0 голосов
/ 23 января 2019

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

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

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

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

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:У вас есть ошибка в вашем синтаксисе SQL;обратитесь к руководству, соответствующему вашей версии сервера MariaDB, чтобы узнать правильный синтаксис для использования рядом с '.000, MaxDefense = 0 WHERE UUID =' d839d1f0-ad5b-4922-841c-1d6ee05d9f56 '' в строке 1

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

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

MessageFormat.format ("INSERT INTO PlayerData (UUID, VIPExpirationDate, *)1020 *, 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)

1 Ответ

0 голосов
/ 23 января 2019

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

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

...