关于MySql字段类型的实践总结

当字段为数值类型时应使用无符号UNSIGNED修饰

ALTER TABLE `info`MODIFY COLUMN `user_id` int UNSIGNED NOT NULL;

当字段为varchar类型时应注意是否选择合适的字符集

        例如存储一些范围值,数字+英文字符时(IP、生日、客户端标识等或以“,”分隔的数据),可以选择使用asciiascii_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与枚举的自动映射实践总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/582255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google Chrome 现在会在后台扫描泄露的密码

谷歌表示&#xff0c;Chrome 安全检查功能将在后台运行&#xff0c;检查网络浏览器中保存的密码是否已被泄露。 如果桌面用户正在使用标记为危险的扩展程序&#xff08;从 Chrome Web Store 中删除&#xff09;、最新的 Chrome 版本&#xff0c;或者如果启用安全浏览来阻止 Go…

Dolphinscheduler-3.2.0 离线部署 伪集群模式

Dolphinscheduler-3.2.0(离线)伪集群模式 一、依赖(前置准备工作) 1.JDK&#xff1a;版本要求 JDK(1.8),安装并配置 JAVA_HOME 环境变量,并将其下的 bin 目录追加到PATH 环境变量中; 2.数据库&#xff1a;PostgreSQL(8.2.15) 或者MySQL(5.7),两者任选其一即可,如 MySQL 则需要…

我的NPI项目之行业黑话 -- 电子/机构/软件/认证

因为最近的NPI项目&#xff0c;参加了很多项目的会议&#xff0c;有电子/机构/软件/认证相关的各方面的专业词汇就出现了。这里我将之称为黑话&#xff0c;就是对我&#xff08;纯软件) 来说是黑盒的话。这里简单记录并用于理解。 EE有关&#xff1a; Layout&#xff0c;一直…

基于Qt之QChart 图表(优美的曲线图案例)

## 项目演示 平台:ubuntu18.04 Qt版本:QT5.14.2 源码位置GitCode:https://gitcode.com/m0_45463480/QCharts/tree/main ## QChart 图表 自从 Qt 发布以来,给跨平台的用户带来很多便利。在 Qt5.7 之前,Qt 在开源社区版本里没有 Qt Charts(自带的绘图组件库)。这使得像…

安卓开发学习笔记

Android发展历史 开发工具 Android Studio 安装工具 下载页面&#xff1a;下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 安装步骤 要求代理&#xff0c;关闭就可以 下载SDK 完成后创建新项目 努力学习中~

12-28

#include <iostream>using namespace std; class Person {int *age;string &name; public:void ss(){cout<<"年龄:"<<*age<<endl<<"名字:"<<name<<endl;}//拷贝构造函数(深拷贝&#xff09;Person(const Pe…

docker学习(二十一、network使用示例container、自定义)

文章目录 一、container应用示例1.需要共用同一个端口的服务&#xff0c;不适用container方式2.可用示例3.停掉共享源的容器&#xff0c;其他容器只有本地回环lo地址 总结 二、自定义网络应用示例默认bridge&#xff0c;容器间ip通信默认bridge&#xff0c;容器间服务名不通 自…

C++ DAY1 作业

1.定义自己的命名空间myspace&#xff0c;并在myspace中定义一个字符串&#xff0c;并实现求字符串长度 #include <iostream>using namespace std; namespace myspace {string str;int length_fun(){getline(cin,str);int i 0;while(str[i] ! \0){i;}return i;}} using…

数字反转(升级版)#洛谷

题目背景 以下为原题面&#xff0c;仅供参考: 给定一个数&#xff0c;请将该数各个位上数字反转得到一个新数。 这次与 NOIp2011 普及组第一题不同的是&#xff1a;这个数可以是小数&#xff0c;分数&#xff0c;百分数&#xff0c;整数。整数反转是将所有数位对调&#xff…

案例214:基于微信小程序的水果销售系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

【网络安全 | 指纹识别工具】WhatWeb使用详析

前言 WhatWeb 是一款用于识别 Web 应用程序和 Web 服务器的开源工具。它可以识别网站使用的编程语言、Web 框架、Web 服务器软件、Web 应用程序等信息&#xff0c;从而帮助安全测试人员快速了解目标网站的技术特征&#xff0c;发现可能存在的漏洞。 本文将对 WhatWeb 的使用方法…

git 如何将某个分支的某个提交复制到另外一个分支

请直接去看原文: 原文链接:git 如何将某个分支的某个提交复制到另外一个分支_gitlab里面的markdown文件可以复用其他分支的吗-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------…

184.【2023年华为OD机试真题(C卷)】IPv4地址转换成整数(位运算实现JavaPythonC++JS)

请到本专栏顶置查阅最新的华为OD机试宝典 点击跳转到本专栏-算法之翼:华为OD机试 🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,深度掌握! 文章目录 184.【2023年华为OD机试真题(C卷)】IPv4地址转换成整…

GIT如何重新生成ssh密钥过程

GIT如何重新生成ssh密钥过程 一、生成密钥前需要把之前的密钥删除吆 第一步&#xff1a;重新配置用户名和邮箱&#xff08; Git Bash 或命令窗口&#xff09; 1、配置用户命令&#xff1a;git config --global user.name “xxxxx” 2、配置邮箱命令&#xff1a;git config …

【我与Java的成长记】之this引用和构造方法的使用详解

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 &#x1f31f; 个人主页&#xff1a;古德猫宁- &#x1f308; 信念如阳光&#xff0c;照亮前行的每一步 文章目录 系列文章目录&#x1f308; *信念如阳光&#xff0c;照亮前行的每一步* 前言一、this的使用this引用的特…

Hive-DDL详解(超详细)

文章目录 前言HiveQL的数据定义语言&#xff08;DDL&#xff09;1. 创建数据库2. 切换到指定数据库3. 创建表格(1) 基本形式:(2) 示例: 4. 查看表格结构5. 删除数据库和表格(1) 删除数据库:(2) 删除数据表: 总结 前言 本教程将介绍HiveQL的数据定义语言&#xff08;DDL&#x…

Elasticsearch 查询命令执行时,如何通过词项索引、词项字典、倒排表定位文档逻辑介绍

这里不涉及到源码&#xff0c;只是根据网上的一些文章总结一下&#xff0c;目前不需要细究&#xff0c;只需要知道大概就好&#xff0c;除非你的工作是二次开发ES 一、​Term Index(词项索引)1、FSM&#xff08;Finite State Machine&#xff09;有限状态机2、FSA&#xff08;F…

SDKMAN的安装与卸载

[官方网站](Installation - SDKMAN! the Software Development Kit Manager) Installing SDKMAN! on UNIX-like platforms is as easy as ever. SDKMAN! installs smoothly on Mac OSX, Linux, WLS, Cygwin, Solaris and FreeBSD. We also support Bash and ZSH shells. Simpl…

力扣刷题记录(20)LeetCode:198、213、337

198. 打家劫舍 我们从第一个开始分析&#xff1a; dp[i]:i表示索引&#xff0c;dp表示当前索引可以拿到的最高金额 索引为0时&#xff0c;可以拿到的最高金额为1&#xff1b; 索引为1时&#xff0c;可以拿到的最高金额就是在索引[0,1]之间取&#xff0c;为2 索引为2时&…

雷军的最后一战,就这?

作者 | 魏启扬 来源 | 洞见新研社 2021年3月30日&#xff0c;小米官宣进军电动汽车赛道后的1003天&#xff0c;小米汽车亮相了。 由于是雷军“人生中最后一次重大的创业项目”&#xff0c;押上了雷军“人生所有积累的战绩和声誉”&#xff0c;小米对于造车极为重视&#xff…