Pernyataan INSERT INTO secara otomatis menambahkan ribuan pemisah ke bilangan bulat Java mulai dari 1000k

Saya mengalami masalah aneh:

Saya memiliki kolom "MaxDealtDamage" yang misalnya lebih rendah dari 1000000 (1000k). kodenya seperti ini:

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

Ketika 1000000 (1000k) atau lebih tinggi, kesalahan ini dikirimkan:

com.mysql.jdbc.Exceptions.jdbc4.MySQLSyntaxErrorException: Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MariaDB Anda untuk mengetahui sintaks yang tepat untuk digunakan di dekat '.000, MaxDefense = 0 WHERE UUID='d839d1f0-ad5b-4922-841c-1d6ee05d9f56'' di baris 1

Berperilaku seperti itu akan mencoba memberinya sebuah String yang berisi "4.000.000" tetapi itu adalah bilangan bulat dengan nilai "4000000" (4000k). Untuk memastikan output saat runtime adalah 4000000 saya memeriksa ulang.

Inilah pertanyaannya:

MessageFormat.format("MASUKKAN KE Data Pemain(UUID,VIPExpirationDate,IPv4,FirstPlayTime,LastPlayTime,TotalPlayTime,TotalLogins,MaxDealtDamage,MaxDefense) " + "NILAI(''{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 sumber
comment
Pertanyaan yang mencari bantuan debug (mengapa kode ini tidak berfungsi?) harus menyertakan perilaku yang diinginkan, masalah atau kesalahan tertentu, dan kode terpendek yang diperlukan untuk mereproduksinya dalam pertanyaan itu sendiri. Pertanyaan tanpa rumusan masalah yang jelas tidak berguna bagi pembaca lain. Lihat: Cara membuat contoh Minimal, Lengkap, dan Dapat Diverifikasi.   -  person Joe C    schedule 23.01.2019


Jawaban (1)


MessageFormat bukan alat untuk membuat pernyataan SQL. Ini adalah utilitas sederhana untuk membuat pesan teks dengan format yang benar.

Anda seharusnya menggunakan PreparedStatement dengan bind parameter seperti yang dijelaskan dalam tutorial Menggunakan Pernyataan yang Disiapkan. JDBC akan mengurus pelolosan dan memformat nilai yang diberikan sehingga dapat diterima oleh server database sambil mencegah SQL Injections.

person Karol Dowbecki    schedule 22.01.2019
comment
Terima kasih atas jawabannya, saya seharusnya berpikir bahwa MessageFormat hanya untuk pembuatan teks. - person Quantum; 23.01.2019
comment
Bekerja cukup baik dan bahkan lebih sedikit pekerjaan, terima kasih! :) - person Quantum; 23.01.2019
comment
@Quantum dan aman, silakan baca tentang serangan SQL Injection - person Karol Dowbecki; 23.01.2019
comment
Anda benar karena ini juga lolos sejauh yang saya baca. - person Quantum; 23.01.2019