数据库 in 可以包含的参数个数
这是我第一次写博客,所以有什么问题,还请大家多多见谅:
1>总结:
数据库中 IN 可以包含的选项数如下:
MySql 数据库:无限制;只是限制了sql语句的大小;
Oracle数据库:9i(256) 10g(1000)
2>MySql max_allowed_packet 操作:
我用的是 MySql (5.6.28) 版本的数据库,可以通过如下命令去查询 MySql 数据库所允许的最大 sql 语句的大小(或长度):
show VARIABLES like '%max_allowed_packet%';
max_allowed_packet 就是记录 MySql 所允许的最大sql语句的长度,单位为bite , 上述为4M
修改 max_allowed_packet :
可以编辑my.cnf来修改(windows下my.ini),在[mysqld]段或者mysql的server配置段进行修改,
max_allowed_packet=10M
或者通过命令:
set global max_allowed_packet = 10*1024*1024;
3> Java 中,如果查询的sql 语句中,in 的选项数大于 1000 时,对集合进行分割的方法:
1 public class InOperationUtil { 2 private static Logger logger = LoggerFactory.getLogger(InOperationUtil.class); 3 private static final int IN_LENGTH_LIMIT = 1000; 4 5 //为防止in的内容过大,分隔list 6 public static <T> List<List<T>> divideList(List<T> dataList){ 7 List<List<T>> resultList = new ArrayList<List<T>>(); 8 if(CollectionUtils.isEmpty(dataList)) { 9 return resultList; 10 } 11 12 Integer dataSize = dataList.size(); 13 14 if(dataSize > IN_LENGTH_LIMIT) { 15 int batchSize = dataSize % IN_LENGTH_LIMIT == 0 ? dataSize / IN_LENGTH_LIMIT:dataSize / IN_LENGTH_LIMIT +1;//分批数 16 logger.info("共有 "+dataSize+" 条,分为 "+batchSize+" 批"); 17 18 for (int i = 0; i < batchSize; i++) { 19 //每1000条添加一次 20 int start = i * IN_LENGTH_LIMIT; 21 int end = start + IN_LENGTH_LIMIT > dataSize ? dataSize : start + IN_LENGTH_LIMIT; 22 23 List<T> divideList = dataList.subList(start, end); 24 resultList.add(divideList); 25 } 26 }else { 27 resultList.add(dataList); 28 } 29 return resultList; 30 } 31 }