数据库 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 }

 

posted @ 2018-10-15 14:35  菜鸟辗迟  阅读(2000)  评论(0编辑  收藏  举报