คำสั่ง INSERT INTO จะเพิ่มตัวคั่นหลักพันให้กับจำนวนเต็ม Java โดยอัตโนมัติโดยเริ่มต้นที่ 1,000k

ฉันพบปัญหาแปลก ๆ :

ฉันมีคอลัมน์ "MaxDealtDamage" ซึ่งต่ำกว่า 1000000 (1,000k) รหัสเป็นเช่นนี้:

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

เมื่อเป็น 1000000 (1,000k) หรือสูงกว่า ข้อผิดพลาดนี้กำลังถูกส่ง:

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,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);


person Quantum    schedule 22.01.2019    source แหล่งที่มา
comment
คำถามที่ต้องการความช่วยเหลือในการแก้ไขข้อบกพร่อง (เหตุใดโค้ดนี้จึงใช้งานไม่ได้) จะต้องระบุลักษณะการทำงานที่ต้องการ ปัญหาหรือข้อผิดพลาดเฉพาะ และ โค้ดที่สั้นที่สุดที่จำเป็นในการทำซ้ำ ในคำถามนั้นเอง คำถามที่ไม่มีการระบุปัญหาที่ชัดเจนจะไม่เป็นประโยชน์กับผู้อ่านรายอื่น ดู: วิธีสร้างตัวอย่างขั้นต่ำ สมบูรณ์ และตรวจสอบได้   -  person Joe C    schedule 23.01.2019


คำตอบ (1)


MessageFormat ไม่ใช่เครื่องมือสำหรับสร้างคำสั่ง SQL เป็นยูทิลิตี้ง่ายๆ สำหรับสร้างข้อความที่มีการจัดรูปแบบที่ถูกต้อง

คุณควรใช้ PreparedStatement ด้วยการผูก พารามิเตอร์ตามที่อธิบายไว้ในบทช่วยสอน การใช้คำสั่งที่เตรียมไว้ JDBC จะดูแลการ Escape และการจัดรูปแบบค่าที่ให้มา เพื่อให้เซิร์ฟเวอร์ฐานข้อมูลสามารถรับค่าเหล่านั้นได้ ในขณะเดียวกันก็ป้องกัน SQL Injections.

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