关于MySql字段类型的实践总结
当字段为数值类型时应使用无符号UNSIGNED修饰
ALTER TABLE `info`MODIFY COLUMN `user_id` int UNSIGNED NOT NULL;
当字段为varchar类型时应注意是否选择合适的字符集
例如存储一些范围值,数字+英文字符时(IP、生日、客户端标识等或以“,”分隔的数据),可以选择使用ascii,ascii_general_ci 编码,内部空间占用更小。
巧用MySQL位运算,存储关联数据(tinyint、smallint、int、bigint)
我们知道MySQL是支持位运算的,因此可以更好的利用int等数值类型的存储空间。
例如:IP监控功能中,关联多个处罚的枚举类型字段、用户关联的多客户端字段,可以选择使用tinyint(1字节8位)、smallint(2字节16位)、int(4字节32位)、bigint(8字节64位),而不是以‘,’分隔的“1,2,3”。
具体字段的类型应该根据类型的数量选择,例如:客户端包括{PC、WAP、Android、IOS、Wechat、WechatMP} 6种类型,可以选择tinyint预留两个拓展类型位置,也可以选择smallint预留10个拓展类型位置。
此种存储方式如何写查询SQL?
首先,通过枚举的ordinal(是枚举的下标可以通过java.lang.Enum实现)可以计算类型对应的二进制数据形式(以tinyint为例):
PC 0 00000001
WAP 1 00000010
Android 2 00000100
IOS 3 00001000
Wechat 4 00010000
WechatMP 5 00100000
public static void main(String[] args) {int PC = 1 << 0, WAP = 1 << 1, Android = 1 << 2, IOS = 1 << 3, Wechat = 1 << 4, WechatMP = 1 << 5;System.out.println("PC = " + Integer.toBinaryString(PC));System.out.println("WAP = " + Integer.toBinaryString(WAP));System.out.println("Android = " + Integer.toBinaryString(Android));System.out.println("IOS = " + Integer.toBinaryString(IOS));System.out.println("Wechat = " + Integer.toBinaryString(Wechat));System.out.println("WechatMP = " + Integer.toBinaryString(WechatMP));// 输出:// PC = 1// WAP = 10// Android = 100// IOS = 1000// Wechat = 10000// WechatMP = 100000}
通常查询包含两种类型,匹配多类型中的一个(查询在PC或IOS登录过的用户)和同时包含多类型(查询在PC和IOS登录过的用户)
假设存在type=62=00111110的记录,它表示这位用户在WAP、Android、IOS、Wechat、WechatMP登录过。
1、合并不同类型二进制值
System.out.println("合并PC和IOS:" + Integer.toBinaryString(PC |= IOS) + "\t十进制:" + (PC |= IOS));System.out.println("合并PC、Android、IOS(合并顺序不印象结果):" + Integer.toBinaryString(PC |= IOS |= Android) + "\t十进制:" + (PC |= IOS |= Android));// 输出:// 合并PC和IOS:1001 十进制:9// 合并PC、Android、IOS(合并顺序不印象结果):1101 十进制:13
2、SQL匹配多类型中的一个 = 进行&运算求交集,存在交集
where (type & $合并结果) > 0-- 1101不足8为补零:00001101,条件00111110 & 00001101 > 0,大于零表示存在交集,计算过程:
-- 00111110
-- 00001101
-- 00001100(交集)
3、SQL同时包含多类型 = 进行&运算求交集,交集等于给定值
where (type & $合并结果) = $合并结果-- 1101不足8为补零:00001101,条件00111110 & 00001101 = 00001101,大于零表示存在交集,计算过程:
-- 00111110
-- 00001101
-- 00001100(交集)
结果可想而知,00001100不等于00001101,因此无法匹配这条记录。那么现在可以假设存在type=61=00111101记录,表示用户在PC、Android、IOS、Wechat、WechatMP登录过,此时计算过程:
-- 00111101 & 00001101 = 00001101,大于零表示存在交集,计算过程:
-- 00111101
-- 00001101
-- 00001101(交集)
此时结果等于00001101,命中数据行。
此种数据存储方案存在问题:mysql数据可读性降低,需要一定理解能力,且对前端输出时应做响应的格式转换。
例如:前端识别类型(PC、WAP、Android、IOS、Wechat、WechatMP)可能是0、1、2、3、4、5,那么从数据库读取到的62=00111110,则应该进行解析,解析的过程就是验证每个类型是否包含在00111110中,也就是 00111110&$类型=$类型 是否成立。
而具体的实践,我们可以封装成枚举(enum),枚举实体应该有一个ordinal属性提供给前端使用,如果你有兴趣可以研究下如何基于jdk的java.lang.Enum进行实现,其内部已提供ordinal属性,后续有时间会出一个更详细的MySql与枚举的自动映射实践总结。
相关文章:
关于MySql字段类型的实践总结
当字段为数值类型时应使用无符号UNSIGNED修饰 ALTER TABLE infoMODIFY COLUMN user_id int UNSIGNED NOT NULL; 当字段为varchar类型时应注意是否选择合适的字符集 例如存储一些范围值,数字英文字符时(IP、生日、客户端标识等或以“,”分隔的数据&…...
UG NX二次开发(C#)-Ufun和NXOpen混合编程
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、Ufun函数3、 NXOpen4、混合编程实现1、前言 在UG NX二次开发过程中,采用Ufun功能比较简单,能用比较少的代码实现我们需要的功能,但是ufun函数的功能不是很强大,尤其随着UG NX的版本…...
【Spark精讲】一文讲透Spark RDD
MapReduce的缺陷 MR虽然在编程接口的种类和丰富程度上已经比较完善了,但这些系统普遍都缺乏操作分布式内存的接口抽象,导致很多应用在性能上非常低效 。 这些应用的共同特点是需要在多个并行操 作之间重用工作数据集 ,典型的场景就是机器学习…...
如在MT9040、IDT82V3001A 等锁相环上电后或输入参考频率改变后必须复位锁相环。
锁相环是一种反馈控制系统,它能够将输出信号的相位锁定到输入参考信号的相位上。在实际应用中,如MT9040、IDT82V3001A等PLL集成电路在上电后或者当输入参考频率发生变化后通常需要复位的原因涉及到几个方面: 1、初始化状态: 当PLL电路上电时,其内部的各个组件可能…...
构建安全的SSH服务体系
某公司的电子商务站点由专门的网站管理员进行配置和维护,并需要随时从Internet进行远程管理,考虑到易用性和灵活性,在Web服务器上启用OpenSSH服务,同时基于安全性考虑,需要对 SSH登录进行严格的控制,如图10…...
wpf ComboBox绑定数据及变更事件
定义ComboBox,以及SelectionChanged事件 <ComboBox x:Name"cmb_radius" Height"30" Width"65" FontSize"15" DisplayMemberPath"Value" SelectedValuePath"Key" HorizontalAlignment"Center&…...
SQL BETWEEN 操作符
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。 SQL BETWEEN 语法 SELECT column1, column2, ... FROM table_name WHERE column BETWEEN value1 AND value2; 参数说明: column1, column2, ...:要选择的字段名…...
Java位运算及移位运算
java中能表示整数数据类型的有byte、short、char、int、long,在计算机中占用的空间使用字节描述,1个字节使用8位二进制表示。 数据类型字节数二进制位数表示范围默认值byte18-27 – 27-10char2160 – 216-1\u0000 (代表字符为空 转成int就是0)short216-…...
上界通配符(? extends Type)
在Java中,? extends Type是一个上界通配符,表示参数化类型的上限是Type。这意味着容器可以持有Type类型的任何对象或者Type的子类型对象。 使用场景 这种类型的通配符常用于泛型方法中,允许方法接受Type的实例或其子类型的集合。这同样基于…...
zlib.decompressFile报错 【Bug已解决-鸿蒙开发】
文章目录 项目场景:问题描述原因分析:解决方案:方案1方案2此Bug解决方案总结寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了zlib.decompressFile报错 的问题。 问题: zlib.decompressFile报错,怎么解…...
54.网游逆向分析与插件开发-游戏增加自动化助手接口-项目需求与需求拆解
内容来源于:易道云信息技术研究院VIP课 项目需求: 为游戏增加VIP功能-自动化助手。自动化助手做的是首先要说一下背景,对于授权游戏来讲它往往年限都比较老,老游戏和新游戏设计理念是不同的,比如说老游戏基本上在10年…...
Spring Boot笔记2
3. SpringBoot原理分析 3.1. 起步依赖原理解析 3.1.1. 分析spring-boot-starter-parent 按住Ctrl键,然后点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-starter-parent的pom.xml,xml配置如下(只摘抄了部分重…...
MySQL5.7服务器 SQL 模式
官网地址:MySQL :: MySQL 5.7 Reference Manual :: 5.1.10 Server SQL Modes 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. MySQL 5.7 参考手册 / ... / 服务器 SQL 模式 5.1.10 服务器 SQL 模式…...
关于LayUI表格重载数据问题
目的 搜索框搜索内容重载数据只显示搜索到的结果 遇到的问题 在layui官方文档里介绍的table属性有data项,但使用下列代码 table.reload(test, {data:data //data为json数据}); 时发现,会会重新调用table.render的url拿到原来的数据,并不会显示出来传…...
MyBatis-mapper.xml配置
1、配置获取添加对象的ID <!-- 配置我们的添加方法,获取到新增加了一个monster对象的iduseGeneratedKeys"true" 意思是需要获取新加对象的主键值keyProperty"monster_id" 表示将获取到的id值赋值给Monster对象的monster_id属性 --><…...
【如何选择Mysql服务器的CPU核数及内存大小】
文章目录 🔊博主介绍🥤本文内容📢文章总结📥博主目标 🔊博主介绍 🌟我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…...
【从浅到深的算法技巧】4.静态方法
1.1.6静态方法 在许多语言中,静态方法被称为函教,静态方法是一组在被调用时会被顺序执行的语句。修饰符static将这类方法和1.2的实例方法区别开来。当讨论两类方法共有的属性时我们会使用不加定语的方法一词。 1.1.6.1静态方法 方法封装了由一系列语句…...
YOLO手部目标检测
手部目标检测原文地址如下:手部关键点检测2:YOLOv5实现手部检测(含训练代码和数据集)_yolov5 关键点检测-CSDN博客 手部检测数据集地址如下: 手部关键点检测1:手部关键点(手部姿势估计)数据集(含下载链接)_手关键点数据集-CSDN博…...
网络IP地址如何更改?怎么使用动态代理IP提高网速?
网络IP地址更改以及使用动态代理IP提高网速的步骤如下: 一、更改IP地址 1. 打开浏览器,输入路由器登陆地址并登陆路由器后台管理界面。 2. 找到“高级设置”或“无线设置”或“VPN设置”一栏,点击“断开”,即可断开网络࿰…...
Flink实时电商数仓之DWS层
需求分析 关键词 统计关键词出现的频率 IK分词 进行分词需要引入IK分词器,使用它时需要引入相关的依赖。它能够将搜索的关键字按照日常的使用习惯进行拆分。比如将苹果iphone 手机,拆分为苹果,iphone, 手机。 <dependency><grou…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
