mysql里bigint插入数据问题

探讨使用MySQL存储IP地址转换为Long类型时遇到的数据溢出问题,尝试通过不同方式解决,包括Hibernate和JDBC操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用mysql做一个ip地下址库,把ip地址转换成long型后插到数据库(数据库该字段用的是bigint,文档中说有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到
18446744073709551615。),为什么在发生溢出先前用的是hibernate以为是hibernate有问题,改用jdbc插也不行发生溢出,变成负数了,改用unsiged也不行,呵呵,当然会不行,也只多一位    

这是jdbc错误抛出异常:Exception in thread "main" java.sql.BatchUpdateException: Data truncation: Out of range value adjusted for column 'lstartip' at row 1
 at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1269)
 at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:955)
 at Initdata3.main(Initdata3.java:106)

### 创建 `BIGINT` 字段并正确插入数据的方法 在 MySQL 数据库中,`BIGINT` 是一种用于存储大整数的数据类型。它的取值范围是从 `-2^63` 到 `2^63 - 1`,即从 `-9,223,372,036,854,775,808` 到 `9,223,372,036,854,775,807`[^4]。以下是如何创建一个包含 `BIGINT` 类型字段的表,并正确插入数据的详细方法。 #### 创建包含 `BIGINT` 字段的表 使用 `CREATE TABLE` 语句可以定义一个包含 `BIGINT` 字段的表。例如: ```sql CREATE TABLE big_int_table ( id BIGINT NOT NULL AUTO_INCREMENT, big_value BIGINT NOT NULL, PRIMARY KEY (id) ); ``` - `id` 是一个自增的主键字段。 - `big_value` 是一个 `BIGINT` 类型的字段,用于存储大整数值。 #### 插入数据到 `BIGINT` 字段 为了确保数据能够正确插入到 `BIGINT` 字段中,需要保证插入的值在 `BIGINT` 的取值范围内。以下是几种插入数据的方式: 1. **直接插入整数值** 如果插入的值是一个普通的整数,可以直接使用 `INSERT INTO` 语句: ```sql INSERT INTO big_int_table (big_value) VALUES (9223372036854775807); ``` 2. **插入超出范围的值** 如果尝试插入超出 `BIGINT` 范围的值,MySQL 会抛出错误或警告。例如: ```sql INSERT INTO big_int_table (big_value) VALUES (9223372036854775808); -- 超出范围 ``` 此时,可以通过调整 SQL 模式(如启用严格模式)来控制行为。 3. **插入通过计算生成的值** 可以使用 MySQL 内置函数或其他表达式生成符合范围的值: ```sql INSERT INTO big_int_table (big_value) VALUES (FLOOR(RAND() * 9223372036854775807)); ``` 4. **批量插入数据** 如果需要批量插入大量数据,可以结合存储过程实现。例如: ```sql DELIMITER $$ CREATE PROCEDURE InsertBigIntData() BEGIN DECLARE i INT DEFAULT 0; WHILE i < 1000 DO INSERT INTO big_int_table (big_value) VALUES (FLOOR(RAND() * 9223372036854775807)); SET i = i + 1; END WHILE; END$$ DELIMITER ; CALL InsertBigIntData(); ``` #### 处理精度丢失问题 当从数据库中读取 `BIGINT` 类型的数据并在应用程序中处理时,可能会遇到精度丢失的问题。例如,在 Java 中使用 `Long` 类型接收 `BIGINT` 数据时,如果数值过大,可能会导致精度丢失[^3]。为了解决这一问题,可以在应用程序中配置全局处理器,将 `Long` 类型序列化为字符串。例如: ```java @Configuration public class JacksonConfig { @Bean public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() { final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); builder.serializationInclusion(JsonInclude.Include.NON_NULL); final ObjectMapper objectMapper = builder.build(); SimpleModule simpleModule = new SimpleModule(); // Long 转为 String 防止 js 丢失精度 simpleModule.addSerializer(Long.class, ToStringSerializer.instance); objectMapper.registerModule(simpleModule); return new MappingJackson2HttpMessageConverter(objectMapper); } } ``` #### 注意事项 - 确保插入的值在 `BIGINT` 的取值范围内,否则会导致插入失败或数据不准确。 - 在应用程序中处理 `BIGINT` 数据时,建议根据实际需求选择合适的数据类型,避免精度丢失。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值