NUC980-OLED实现全中文字库的方法

1.背景

有一个产品,客户需要屏幕展示一些内容,要带一些中文,实现了OLED12864的驱动,但是它不带字库,现在要实现OLED全字库的显示

2.制作原始字库

下载软件pctolcd2002

设置

制作字库

打开原始文件

用软件自带的,或者自己去找字

生成字库文件

生成的内容如下

特别注意,保存的文件编码要是UTF-8的,不然后面会有点麻烦

3.转换

自行调整内容,字符"啊"之前的可以不要

目标格式应该是这样的

4.实现OLED驱动接口

oled.c

#include "oled.h"/* ssd1306所对应的I2C控制器的设备节点 */ 
#define SSD1306_DEVICE      "/dev/i2c-0"    /* ssd1306的I2C设备地址 */
#define SSD1306_ADDR    0x3Cuint8_t OLED_Display[128][8];
uint8_t OLED_Display_Cache[128][8];static int oled_fd;/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char command)
{unsigned char buf[2];buf[0] = 0x00;  // 控制字节,0x00表示接下来的字节是命令buf[1] = command;write(oled_fd, buf, 2);
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char data)
{unsigned char buf[2];buf[0] = 0x40;  // 控制字节,0x40表示接下来的字节是数据buf[1] = data;write(oled_fd, buf, 2);
}void OLED_WR_Byte(unsigned dat,unsigned cmd)
{if(cmd){Write_IIC_Data(dat);}else {Write_IIC_Command(dat);}
}/*        设置OLED屏的显示坐标*      X : 表示OLED的水平坐标(0—127)*      Y : 表示OLED的页(0—7)
*/
void OLED_Set_Pos(unsigned char x, unsigned char y) 
{   OLED_WR_Byte(0xb0+(y & 0x0f),OLED_CMD);OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);OLED_WR_Byte((x&0x0f),OLED_CMD); 
}         
//开启OLED显示    
void OLED_Display_On(void)
{OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ONOLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
}
//关闭OLED显示     
void OLED_Display_Off(void)
{OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFFOLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
}                    
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!     
void OLED_Clear(void)  
{  uint8_t i,n;            for(i=0;i<8;i++)  {  OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); } //更新显示
}/*
函数功能:OLED打点函数
输入参数:点所在坐标 x=0~127 y = 0~63
输出参数:无
用到的全局变量:无
*/
void OLED_Dot(uint8_t x,uint8_t y,uint8_t state)
{if(state)OLED_Display_Cache[x][y>>3] |= 1 << (y%8); elseOLED_Display_Cache[x][y>>3]&= ~(1 << (y%8)); 
}/*
函数功能:OLED刷屏任务
输入参数:OLED显示缓存数组
输出参数:无
用到的全局变量:无
*/
void OLED_Process()
{unsigned char x,y;for(y=0;y<8;y++){                       for(x=0;x<128;x++){   if(OLED_Display[x][y] != OLED_Display_Cache[x][y])  {OLED_Display[x] [y]= OLED_Display_Cache[x][y];      OLED_Set_Pos(x,y);OLED_WR_Byte(OLED_Display[x] [y],OLED_DATA);}}}
}void OLED_Print(uint8_t x, uint8_t y, char *s)
{uint16_t targetIndex = sizeof(CN16_Msk)/35; // 目标汉字的内码printf("targetIndex:%d\r\n",targetIndex);fflush(stdout);uint16_t length = strlen(s);//取字符串总长printf("length:%d\r\n",length);fflush(stdout);uint16_t offset = x;for(uint16_t i=0;i<length;i++){uint8_t first = *(s+i);if(first <= 127){//小于128是ASCII符号for(uint8_t n=0;n<8;n++){OLED_Display_Cache[x+offset][y] = F8X16[first][n]; OLED_Display_Cache[x+offset][y+1] = F8X16[first][8+n+3]; offset++;}}else if(first > 127){//大于127,为汉字uint8_t utf[4];utf[0] = first;i++;utf[1] = *(s+i);i++;utf[2] = *(s+i);for(uint16_t j=0;j<targetIndex;j++){if(utf[0] == CN16_Msk[j][0] && utf[1] == CN16_Msk[j][1] && utf[2] == CN16_Msk[j][2]){for(uint8_t n=0;n<16;n++){OLED_Display_Cache[x+offset][y] = CN16_Msk[j][n]; OLED_Display_Cache[x+offset][y+1] = CN16_Msk[j][16+n+3]; offset++;}}}}}
}//初始化SSD1306                        
void OLED_Init(void)
{   /* 打开ssd1306对应的I2C控制器文件 */oled_fd =open(SSD1306_DEVICE, O_RDWR);if (oled_fd< 0) {printf("open 0x%s failed \n",SSD1306_DEVICE);}/*设置ssd1306的I2C设备地址*/if (ioctl(oled_fd,I2C_SLAVE_FORCE, SSD1306_ADDR) < 0) {            printf("set slave address failed \n");}usleep(50000);OLED_WR_Byte(0xAE,OLED_CMD);//--display offOLED_WR_Byte(0x00,OLED_CMD);//---set low column addressOLED_WR_Byte(0x10,OLED_CMD);//---set high column addressOLED_WR_Byte(0x40,OLED_CMD);//--set start line address  OLED_WR_Byte(0xB0,OLED_CMD);//--set page addressOLED_WR_Byte(0x81,OLED_CMD); // contract controlOLED_WR_Byte(0xFF,OLED_CMD);//--128   OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverseOLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 dutyOLED_WR_Byte(0xC8,OLED_CMD);//Com scan directionOLED_WR_Byte(0xD3,OLED_CMD);//-set display offsetOLED_WR_Byte(0x00,OLED_CMD);//OLED_WR_Byte(0xD5,OLED_CMD);//set osc divisionOLED_WR_Byte(0x80,OLED_CMD);//OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode offOLED_WR_Byte(0x05,OLED_CMD);//OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge PeriodOLED_WR_Byte(0xF1,OLED_CMD);//OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartionOLED_WR_Byte(0x12,OLED_CMD);//OLED_WR_Byte(0xDB,OLED_CMD);//set VcomhOLED_WR_Byte(0x30,OLED_CMD);//OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enableOLED_WR_Byte(0x14,OLED_CMD);//OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panelOLED_Clear();
}  int main()
{OLED_Init();OLED_Print(8,2,"123和你啊");OLED_Process();while(1){#if 0 //测试按点刷屏for(uint8_t i=0;i<128;i++){for(uint8_t j=0;j<64;j++){OLED_Dot( i,j,1);OLED_Process();}}#endif}return 0;
}

oled.h

#ifndef __OLED_H
#define __OLED_H                 
//#include "sys.h"
#include "stdlib.h"
#include <stdint.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <string.h>#include "oledfont.h"  #define OLED_MODE 0
#define SIZE 8
#define XLevelL     0x00
#define XLevelH     0x10
#define Max_Column  128
#define Max_Row     64
#define Brightness  0xFF 
#define X_WIDTH     128
#define Y_WIDTH     64                                
//-----------------OLED IIC端口定义----------------                                  
#define OLED_CMD  0 //写命令
#define OLED_DATA 1 //写数据//OLED控制用函数
void OLED_Display_On(void);
void OLED_Display_Off(void);                                            
void OLED_Init(void);
void OLED_Clear(void);#endif  

5.字库调整

利用python把ascii编码改为utf8编码

with open('input.txt', 'r', encoding='utf-8') as input_file:with open('output.txt', 'w', encoding='utf-8') as output_file:for line in input_file:char = line.strip()utf8_byte = char.encode("utf-8")hex_str = ", ".join([f"0x{x:02x}" for x in utf8_byte])output_file.write(hex_str + "\n")

输入文件是

输出信息是

截取字库片段

#ifndef __OLEDFONT_H
#define __OLEDFONT_H        /****************************************8*16的点阵************************************/
const unsigned char F8X16[][16]=      
{
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0xF0,0x08,0xF0,0x80,0x60,0x18,0x00,0x00,0x00,0x31,0x0C,0x03,0x1E,0x21,0x1E,0x00},/*"%",37*/
{0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x2C,0x19,0x27,0x21,0x10},/*"&",38*/
{0x00,0x12,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",39*/
{0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00},/*"(",40*/
{0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00},/*")",41*/
{0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00},/*"*",42*/
{0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x0F,0x01,0x01,0x01},/*"+",43*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x70,0x00,0x00,0x00,0x00,0x00},/*",",44*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00},/*"-",45*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00},/*".",46*/
{0x00,0x00,0x00,0x00,0xC0,0x38,0x04,0x00,0x00,0x60,0x18,0x07,0x00,0x00,0x00,0x00},/*"/",47*/
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},/*"0",48*/
{0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00},/*"1",49*/
{0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},/*"2",50*/
{0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00},/*"3",51*/
{0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24},/*"4",52*/
{0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00},/*"5",53*/
};// typedef struct {
//     // unsigned char Index[3];  // 汉字UTF-8内码
//     // unsigned char Msk[32];  // 字模
//     unsigned char Msk[35];
// } __attribute__((packed)) GB2312_GB16_t;const unsigned char CN16_Msk[][35]={
{0xe5, 0x95, 0x8a,0xFC,0x04,0xFC,0x00,0xFE,0x42,0xBE,0x00,0xF2,0x12,0xF2,0x02,0xFE,0x02,0x00,0x00,0x0F,0x04,0x0F,0x00,0xFF,0x10,0x0F,0x00,0x0F,0x04,0x4F,0x80,0x7F,0x00,0x00,0x00},/*'啊',1410*/
{0xe9, 0x98, 0xbf,0x00,0xFE,0x02,0x22,0xDA,0x06,0x00,0xF2,0x12,0x12,0xF2,0x02,0xFE,0x02,0x02,0x00,0x00,0xFF,0x08,0x10,0x08,0x07,0x00,0x0F,0x04,0x04,0x4F,0x80,0x7F,0x00,0x00,0x00},/*'阿',1411*/
{0xe5, 0x9f, 0x83,0x20,0x20,0xFF,0x20,0x20,0x10,0x98,0xF4,0x92,0x91,0x90,0x94,0x98,0x30,0x00,0x00,0x10,0x30,0x1F,0x08,0x88,0x85,0x44,0x24,0x14,0x0F,0x14,0x24,0x44,0x84,0x84,0x00},/*'埃',1412*/
{0xe6, 0x8c, 0xa8,0x10,0x10,0xFF,0x10,0x00,0x10,0x98,0xF4,0x92,0x91,0x90,0x94,0x98,0x30,0x00,0x00,0x42,0x82,0x7F,0x01,0x84,0x85,0x44,0x24,0x14,0x0F,0x14,0x24,0x44,0x84,0x84,0x00},/*'挨',1413*/
{0xe5, 0x93, 0x8e,0x00,0xFC,0x04,0x04,0xFC,0x00,0xC4,0x1F,0x04,0x04,0x04,0x1F,0xC4,0x04,0x00,0x00,0x00,0x0F,0x04,0x04,0x8F,0x80,0x40,0x23,0x14,0x08,0x14,0x23,0x40,0x80,0x80,0x00},/*'哎',1414*/
{0xe5, 0x94, 0x89,0xFC,0x04,0x04,0xFC,0x00,0x10,0x98,0xF4,0x92,0x91,0x90,0x94,0x98,0x30,0x00,0x00,0x1F,0x08,0x08,0x1F,0x84,0x85,0x44,0x24,0x14,0x0F,0x14,0x24,0x44,0x84,0x84,0x00},/*'唉',1415*/
};
#endif

6.显示效果

7.优化

上面的代码,存在一个问题是,Y轴的步进必须是8个点,需要优化为任意位置的显示

void OLED_Dot_Line(uint8_t x, uint8_t y, uint8_t temp)
{for(uint8_t i=0;i<8;i++){       if(temp&0x01)   {OLED_Dot(x,y,1);}  else{OLED_Dot(x,y,0);}temp = temp>>1;y++;if(y>=64)return;    //超区域了}    
}void OLED_Print(uint8_t x, uint8_t y, char *s)
{uint16_t targetIndex = sizeof(CN16_Msk)/35; // 目标汉字的内码uint16_t length = strlen(s);//取字符串总长// printf("length:%d\r\n",length);// fflush(stdout);uint16_t offset = x;for(uint16_t i=0;i<length;i++){uint8_t first = *(s+i);if(first <= 127){//小于128是ASCII符号for(uint8_t n=0;n<8;n++){OLED_Dot_Line(x+offset,y,F8X16[first][n]);OLED_Dot_Line(x+offset,y+8,F8X16[first][n+8]);offset++;}}else if(first > 127){//大于127,为汉字uint8_t utf[4];utf[0] = first;i++;utf[1] = *(s+i);i++;utf[2] = *(s+i);for(uint16_t j=0;j<targetIndex;j++){if(utf[0] == CN16_Msk[j][0] && utf[1] == CN16_Msk[j][1] && utf[2] == CN16_Msk[j][2]){for(uint8_t n=0;n<16;n++){OLED_Dot_Line(x+offset,y,CN16_Msk[j][n+3]);OLED_Dot_Line(x+offset,y+8,CN16_Msk[j][n+16+3]);offset++;}}}}}
}

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

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

相关文章

“用友审批+民生付款”,YonSuite让企业发薪更准时

随着现代企业经营模式的不断创新和市场竞争的加剧&#xff0c;企业薪资管理和发放的效率、准确性和及时性已成为企业管理的重要一环。然而&#xff0c;在实际操作中&#xff0c;许多企业面临着薪资管理复杂、发放流程繁琐、数据不准确等难点和痛点。为了解决这些问题&#xff0…

【重磅消息】微软开源了自家的Florence-2,处理各种视觉任务的统一模型

在人工通用智能&#xff08;AGI&#xff09;系统的世界里&#xff0c;一个重要的转变正在发生&#xff0c;那就是利用多功能的、预先训练好的表征&#xff0c;在各种应用中表现出与任务无关的适应性。这种转变始于自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;现在…

机械硬盘和固态硬盘的区别及判断硬盘类型的方法

HDD&#xff08;机械硬盘&#xff09;和 SSD&#xff08;固态硬盘&#xff09;的主要区别 存储介质 HDD&#xff1a;使用磁性盘片&#xff08;磁盘&#xff09;和机械读写头SSD&#xff1a;使用闪存芯片 速度 HDD&#xff1a;读写速度较慢&#xff0c;因为需要机械读写头在…

新学期分班群发话术

尊敬的家长们&#xff1a; 我是XX学校X年级的班主任XXX老师。随着新学期的到来&#xff0c;我带着满心的期待和责任&#xff0c;向各位宣布一个重要的信息&#xff1a;本校即将开始新学年的分班工作。 分班的目的&#xff1a; 分班是为了适应不同学生的学习需求&#xff0c;确…

SaaS企业营销:PLG转型下SaaS企业如何成为赢家

在数字化浪潮的推动下&#xff0c;SaaS&#xff08;软件即服务&#xff09;行业正经历着前所未有的变革。特别是随着产品引领增长&#xff08;PLG&#xff09;模式的兴起&#xff0c;SaaS企业正面临着前所未有的机遇与挑战。如何在PLG转型中脱颖而出&#xff0c;成为行业赢家&a…

汇川学习笔记7 - 雕刻机项目

1、系统上电轴准备好之后&#xff0c;自动复回原点一次&#xff0c; 2、在雕刻机面板上有三个按钮用来控制画三种图形 3、注意cnc代码放置的文件夹 4、FILE0文件内容 5、FILE1文件内容 6、FILE2文件内容 7、程序代码下载地址 https://download.csdn.net/download/qq_6191667…

无需科学上网:轻松实现国内使用Coze.com平台自己创建的Bot(如何实现国内免费使用GPT-4o/Gemini等最新大模型)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 如何在国内使用 Coze.com 创建的 Bot 📒📝 创建Bot📝 实现国内使用📝 测试⚓️ 相关链接 ⚓️📖 介绍 📖 Coze.com 是一个强大的平台,允许用户创建各种类型的 Bot。然而,许多国内用户可能会遇到访问问题,导致无法…

Centos7.9安装openldap

文章目录 一、背景二、正文2.1 openldap服务端必要软件安装2.1.1使用yum命令安装2.1.2安装libdb相关依赖2.1.3复制一个默认配置到指定目录下&#xff0c;并授权&#xff0c;这一步一定要做&#xff0c;然后再启动服务&#xff0c;不然生成密码时会报错2.1.4授权给ldap用户&…

windows系统共享文件时,有权限文件访问被拒绝

我们在使用windows操作系统的时候&#xff0c;需要复制或者更改网络中的共享文件。但是有时候会出现图下的情况&#xff1a;文件访问被拒绝 查看共享文件的安全属性&#xff0c;发现Everyone的权限是完全控制的 这个时候我们可以看到&#xff0c;这个共享文件图标右上方带了一把…

vue2实现一个简易实用的日历(可特殊标记多个日期)

效果如下&#xff1a; <template><div class"calendar"><div class"header"><button click"previousMonth"><</button><h2>{{ currentYear }}-{{ currentMonth }} </h2><button click"nex…

【SpringCloud】Nacos

Nacos简介 2018年6月&#xff0c;Eureka 2.0宣布闭源&#xff08;但1.X版本仍然活跃&#xff09;&#xff0c;同年7月&#xff0c;阿里Nacos宣布开源&#xff0c;并迅速成为国内开发者关注的焦点。作为Eureka的替代品&#xff0c;Nacos目前已经成为国内开发者的首选。 Nacos&…

error: ‘CV_YUV2BGR_UYVY‘ was not declared in this scope

遇到这个问题时&#xff0c;按照如下修改可解决问题。 //cv::cvtColor(yuvImg, rgbImg, CV_YUV2BGR_UYVY);cv::cvtColor(yuvImg, rgbImg, cv::COLOR_YUV2RGB_UYVY);

浅析Vite本地构建原理

前言 随着Vue3的逐渐普及以及Vite的逐渐成熟&#xff0c;我们有必要来了解一下关于vite的本地构建原理。 对于webpack打包的核心流程是通过分析JS文件中引用关系&#xff0c;通过递归得到整个项目的依赖关系&#xff0c;并且对于非JS类型的资源&#xff0c;通过调用对应的loade…

《人人都是产品经理》笔记2:一个需求的奋斗史

一个需求的奋斗史 用户&#xff01;用户&#xff01;为什么会有需求&#xff1f;用户比客户更大以用户为中心的思想&#xff0c;以老板为中心的行动 用户研究方法 需求采集用户需求并不是产品需求&#xff0c;满足需求的三种方式把用户需求转化成产品需求 需求打包 BRD 产品会议…

Docker 搭建 MinIO 对象存储

Docker 搭建 MinIO 对象存储 一、MinIO MinIO 是一个高性能的对象存储服务器&#xff0c;用于构建云存储解决方案。MinIO 允许你存储非结构化数据&#xff08;如图片、视频、日志文件等&#xff09;以对象的形式。MinIO 提供简单的部署选项和易于使用的界面&#xff0c;允许你…

【免费API推荐】:汇总多种免费API接口(12)

欢迎来到幂简集成汇总的多种免费API接口世界&#xff01;我们致力于为开发者和创业者提供一个集成了各种免费API接口的平台。在这里&#xff0c;您可以轻松获取多种免费API接口&#xff0c;涵盖了各种领域的需求&#xff0c;包括天气、地图、社交媒体、专利相关信息等等。我们精…

哪里还能申请免费一年期SSL证书?

SSL证书是网络安全的基石之一&#xff0c;它确保了数据传输的安全性和网站身份的真实性。而申请免费一年期SSL证书&#xff0c;则为广大用户提供了一个经济高效的方式来提升网站的安全性。具体介绍如下&#xff1a; 基于不同服务平台的免费SSL证书申请 FreeSSL&#xff1a;此平…

硬盘监控和分析工具:Smartctl

文章目录 1. 概述2. 安装3. 使用4. smartctl属性信息介绍 1. 概述 Smartctl&#xff08;S.M.A.R.T 自监控&#xff0c;分析和报告技术&#xff09;是类Unix系统下实施SMART任务命令行套件或工具&#xff0c;它用于打印SMART自检和错误日志&#xff0c;启用并禁用SMRAT自动检测…

【MySQL】索引的原理及其使用

文章目录 什么叫索引减少磁盘IO次数缓存池(Buffer Pool&#xff09;MySQL的页页内目录页目录 正确理解索引结构为什么Innodb的索引是B树结构各种存储引擎支持的索引聚簇索引和非聚簇索引索引类型 关于索引的操作创建主键索引唯一索引的创建普通索引的创建查看索引删除索引 什么…

APP IOS

APP IOS苹果源生应用程序 APP Android-CSDN博客