Vì vậy, đây là giải pháp:
Nếu bạn không sử dụng câu lệnh chuẩn bị và chỉ chèn bằng câu lệnh SQL chuỗi, bạn không có gì phải lo lắng vì JDBC chỉ cần di chuyển câu lệnh của bạn đến máy chủ MySQL và máy chủ MySQL có thể phân tích cú pháp chính xác chuỗi thành số 64 không dấu (BigInt-20).
Nếu bạn sử dụng câu lệnh chuẩn bị, thì bạn đang gặp rắc rối. Nếu bạn làm như vậy:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
bạn sẽ nhận được một ngoại lệ MySqlDataTruncation vì JDBC muốn cắt ngắn điều này thành dài đã ký.
Nếu bạn làm như vậy:
BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();
Điều này sẽ hoạt động vì giá trị nằm trong ký tự dài của Java.
Vì vậy, giải pháp luôn hoạt động là:
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();
Cuối cùng, bạn chuyển dữ liệu dưới dạng một chuỗi và để máy chủ MySQL phân tích cú pháp nó đúng cách.
Ai đó nên sửa trình điều khiển JDBC vì các số 64-bit không có dấu liên tục xuất hiện trong nhiều ứng dụng thống kê.