数据库跟 null 比较会得到非预期结果

现象 在执行 sql 中得到了非预期结果 1 select*fromuserwhereage>20; 其中, 数据库中存在大量的 age 为 null 的记录, 在执行完上述 sql 后, 没有将 age is null 的数据查出 测试 1 SELECT1>=1,NULL=NULL,Null>1; mysql 5.7.21-log sqlite 3.34.0 postgresql PostgreSQL 14.0 (Debian 14.0-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit 原因 stackoverflow 在 The Three-Valued Logic of SQL 中规定, 与 null 比较返回值为 null The SQL null value basically means “could be anything”.……

阅读全文

Vaultwarden 搭建

准备 docker nginx/caddy 启动 1 docker run -d --name vaultwarden -v `pwd`:./data/ -p 8088:80 vaultwarden/server:latest 此时打开 http://yourhost:8088, 就可以看到页面 配置 在工作目录(即上述执行的目录, 如果 -v 指定了目录, 则为其指定目录)中, 增加一个 config.json 其中 signups_allowed 为是否允许注册, 注册完第一个账号之后建议关闭 admin_token 为 /admin 管理页面的 token, 建议配置完之后将其置空(即不开启 /admin) { "domain": "http://localhost", "sends_allowed": false, "disable_icon_download": false, "signups_allowed": true, "signups_verify": false, "signups_verify_resend_time": 3600, "signups_verify_resend_limit": 6, "invitations_allowed": false, "password_iterations": 100000, "show_password_hint": false, "admin_token": "token", "invitation_org_name": "Vaultwarden", "ip_header": "X-Real-IP", "icon_cache_ttl": 2592000, "icon_cache_negttl": 259200, "icon_download_timeout": 10, "icon_blacklist_non_global_ips": true, "disable_2fa_remember": false, "authenticator_disable_time_drift": false, "require_device_email": false, "reload_templates": false, "log_timestamp_format": "%Y-%m-%d %H:%M:%S.……

阅读全文

博客搭建

准备 hugo github nginx/caddy hugo 注意: 安装 extended 版本, 否则使用第三方主题时会有问题 1 2 3 4 5 hugo new site quickstart cd quickstart git clone https://github.com/flysnow-org/maupassant-hugo themes/maupassant echo theme = \"maupassant\" >> config.toml hugo new posts/my-first-post.md // 测试 hugo server -D // 生成静态文件 hugo -D github 创建 repo 设置 webhook 将上面的 quickstart 文件夹整体进行版本管理(其实只管理 content 也行, 要是为了方便换主题, 可以直接搞整个) 在 server 上启动 webhook server eg.……

阅读全文

python 异常处理

异常处理 1 2 3 4 5 def demo(): try: 1 / 0 except Exception as e: print(type(e)) #<class 'ZeroDivisionError'> 自定义异常 1 2 class CustomError(Exception): pass 异常链 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class CustomError(Exception): pass def demo(): try: 1 / 0 except Exception as e: print(type(e)) #<class 'ZeroDivisionError'> raise CustomError() from e <class 'ZeroDivisionError'> Traceback (most recent call last): File "/Users/tiger/work/customer/dd.……

阅读全文