Tue Feb 24 2026 08:00:00 GMT+0800 (中国标准时间)
今天将使用的Android Studio 从2024.3.2 Patch 1升级为 2025.2.3
今天将使用的Android Studio 从2024.3.2 Patch 1升级为 2025.2.3
1 | select * from t1 where isnull(t1.a) or t1.a = '' and now() between t1.start_date and t2.end_date |
改为
1 | select * from t1 where (isnull(t1.a) or t1.a = '') and now() between t1.start_date and t2.end_date |
1 | <if test="info.registered != null and info.registered != ''"> |
改为
1 | <if test="info.registered != null and info.registered != -1"> |
1 | Expression #1 of SELECT list is not in GROUP BY clause and contains |
1 | select @@GLOBAL.sql_mode; |
1 | set SQL_MODE = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; |
执行的sql语句
1 | CREATE TABLE `tb_task_site` ( |
错误提示
1 | [ERR] 532> 1067 - Invalid default value for 'end_date' |
原因解析
mysql5.7对sql_mode的设置比mysql5.6更严格了,mysql5.6默认的sql_mode:
1 | NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES |
mysql5.7默认sql_mode:
1 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
其中 NO_ZERO_IN_DATE,NO_ZERO_DATE 两个参数使得时间或日期参数 不得 使用0作默认值,也就是上面的sql中 “default ‘0000-00-00 00:00:00’ ”是不被允许的,所以导致该错误提示。
可以通过 select @@sql_mode; 查看自己的mysql设置的sql_mode的值。
sql_mode 使得 sql 语句更严谨,但是又会带来老版本的不兼容问题,所以可以设置sql_mode的值使得新版本兼容老版本的sql脚本。
解决方案
既然是那两个sql_mode参数导致的问题,那就将两个参数去掉就好了。在默认的sql_mode参数去除,只剩下:
1 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
解决方法有如下几种:
1、暂时解决方案,可以在该会话(session)中暂时修改其sql_mode参数,但是会话结束,下一次会话,修改的参数就失效,变为原来的参数。
1 | set SQL_MODE = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; |
执行完之后就可以继续执行建表语句,但是重启mysql后再执行建表语句的话依旧会报错。
2、永久解决方案,可以通过执行sql方式,设置全局sql_mode参数,设置后效果永久生效。
1 | set GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; |
1 | com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure |
如果出现SSLHandshakeException 可尝试添加&useSSL=false 到mysql连接地址
//进入/system/xbin目录下,查看是否有sqlite3
cd /system/xbin
ls -a | grep sqlite3
//有sqlite3,退回到windows系统
exit
//将sqlite3复制到windows下面
adb -s emulator-5554 pull /system/xbin/sqlite3
mount -o remount,rw /system
//退回到windows系统
exit
//将sqlite3复制到/system/xbin目录下面
adb -s 127.0.0.1:7555 push sqlite3 /system/xbin/
//重新进入MuMu模拟器,确保是root#用户
adb -s 127.0.0.1:7555 shell
// 给sqlite3命令可执行权限
chmod 755 /system/xbin/sqlite3
//重现将/system目录变为只读
mount -o remount,ro /system
1.Glide使用.placeholder()展占位图之后,下载图片之后会缩放一下。这是因为你的展位图跟下载的图片的尺寸不一样,而Glide本身有一个淡入淡出效果的动画来显示加载的图片,这样两张不一样的图片造成图片下载刚开始是占位尺寸之后淡入淡出到实际加载图片大小,只要使用.dontanimate()取消淡入淡出效果即可。
2.Glide加载图片之后,点击本图片跳转到查看图片详情的大图,这时候大图会重新加载。我的产品说两张图一样,为什么要重新加载,呃大哥其实两张尺寸不一样哦!算了实现吧,我第一个想法就是通过.override(500, 500)方法来把大图的尺寸跟原来的尺寸配置一样,这时候确实点击原图不需要重新加载直接显示了大图预览,但是大图预览需要可以拉伸,需要缩放,这时候限定大小的图片就难以实现放大功能,只能在一个500*500的框里进行。最后找到解决方案–> Glide.with(this).load(URL)).override(Target.SIZE_ORIGINAL,Target.SIZE_ORIGINAL).placeholder(R.mipmap.uf_uf).into(imageview);即是直接下载图片的原图,Target.SIZE_ORIGINAL是指图片原图的大小,这样就可以保证图片的一致性,本地和预览界面可以搁置设置。
3.Glide加载图片出现空白问题,问题描述:Recyclerview嵌套Recyclerview时,被嵌套的Recyclerview的适配器Adapter中的图片设置自适应,那么滑动到之前的位置,图片有时显示空白,解决方案是要给Adapter图片设置具体大小,这样glide不会每次都去下载新的图片而是复用之间就有的。
‘com.fivehundredpx:blurringview:1.0.0’
compile’com.github.bumptech.glide:glide:3.7.0’
compile’jp.wasabeef:glide-transformations:2.0.1’
1、如果系统的api在16以上,可以使用系统提供的方法直接处理图片
1 | if (VERSION.SDK_INT > 16) {undefined |
2、 如果Api条件不满足,可以使用如下方法
1 | @SuppressLint("NewApi") |
3、以上方法都存在一个问题,性能较低,下面提供一个C实现
1 | static int* StackBlur(int* pix, int w, int h, int radius) {undefined |