mysql 表结构定义文件frm

2023-11-25 15:59
文章标签 mysql 定义 结构 database frm

本文主要是介绍mysql 表结构定义文件frm,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 mysql .frm文件格式

mysql使用不同的文件格式存储信息,本文介绍一下不同的文件格式,怎么读写和理解

无论你选择什么存储引擎,每一个mysql表都使用.frm文件格式描述表结构定义,文件名和表名一致,.frm格式在所有平台上都是一样的,下面使用linux平台作为案例

第一,创建一个表

mysql> CREATE TABLE table1 (column1 CHAR(5)) ENGINE=MYISAM COMMENT '*';
Query OK, 0 rows affected (0.00 sec)

table1.frm文件可以在数据库的数据存储目录下被找到,datadir系统环境变量定义了数据存储目录,一般在/var/lib/mysql目录,

mysql> SHOW VARIABLES LIKE 'datadir';+---------------+-----------------------+| Variable_name | Value                 |+---------------+-----------------------+| datadir       | /usr/local/mysql/var/ |+---------------+-----------------------+1 row in set (0.00 sec)

database()函数可以获取数据库名称

mysql> SELECT DATABASE();+------------+| DATABASE() |+------------+| ff         |+------------+1 row in set (0.00 sec)

可以通过datadir/database_name的方式定位.frm文件,举个例子

shell> su root
shell> cd /usr/local/mysql/var/ff
shell> ls table1.*table1.frm  table1.MYD  table1.MYI
shell> ls -l table1.*
-rw-rw----  1 root root 8566 2006-09-22 11:22 table1.frm
-rw-rw----  1 root root    0 2006-09-22 11:22 table1.MYD
-rw-rw----  1 root root 1024 2006-09-22 11:22 table1.MYI

.MYD(存储数据) 和.MYI(存储索引)文件,后面的文章将会介绍,这里不做介绍,为了理解.frm文件,我们先看一下16进制下的数据

shell> hexdump -v -C table1.frm00000000  fe 01 09 09 03 00 00 10  01 00 00 30 00 00 10 00  |...........0....|00000010  06 00 00 00 00 00 00 00  00 00 00 02 08 00 08 00  |................|00000020  00 05 00 00 00 00 08 00  00 00 00 00 00 00 00 10  |................|00000030  00 00 00 c0 c3 00 00 10  00 00 00 00 00 00 00 00  |................|00000040  2f 2f 00 00 20 00 00 00  00 00 00 00 00 00 00 00  |//.. ...........|...                                                         | (many 0s)      |00001000  00 00 00 00 02 00 ff 00  00 00 00 00 00 00 00 00  |................|00001010  ff 20 20 20 20 20 00 00  06 00 4d 79 49 53 41 4d  |.     ....MyISAM|...                                                         | (many 0s)      |00002000  6c 01 00 10 00 00 00 00  00 00 00 00 00 00 00 00  |l...............|00002010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|00002020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 01 2a  |...............*|...00002100  01 00 01 00 3b 00 05 00  00 00 06 00 0a 00 00 00  |....;...........|00002110  00 00 00 00 00 00 50 00  16 00 01 00 00 00 00 00  |......P.........|00002120  3b 00 02 01 02 14 29 20  20 20 20 20 20 20 20 20  |;.....)         |00002130  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |00002140  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 00  |               .|00002150  04 00 08 63 6f 6c 75 6d  6e 31 00 04 08 05 05 00  |...column1......|00002160  02 00 00 00 80 00 00 00  fe 08 00 00 ff 63 6f 6c  |.............col|00002170  75 6d 6e 31 ff 00                                 |umn1..|00002176

.frm文件头部分

OffsetLengthValueExplanation


0000


1


fe


Always


0001


1


01


Always


0002


1


09


FRM_VER (which is in
include/mysql_version.h) +3
+test(create_info->varchar)


0003


1


09


See enum legacy_db_type in
sql/handler.h. For example, 09 is
DB_TYPE_MYISAM, but 14 if MyISAM with
partitioning.


0004


1


03


??


0005


1


00


Always


0006


2


0010


IO_SIZE


0008


2


0100


??


000a


4


00300000


Length, based on key_length + rec_length +
create_info->extra_size


000e


2


1000


“tmp_key_length”, based on key_length


0010


2


0600


rec_length


0012


4


00000000


create_info->max_rows


0016


4


00000000


create_info->min_rows


001b


1


02


Always (means “use long pack-fields”)


001c


2


0800


key_info_length


001e


2


0800


create_info->table_options also
known as db_create_options? one
possible option is HA_LONG_BLOB_PTR


0020


1


00


Always


0021


1


05


Always (means “version 5 frm file”)


0022


4


00000000


create_info->avg_row_length


0026


1


08


create_info->default_table_charset


0027


1


00


Always


0028


1


00


create_info->row_type


0029


6


00..00


Always (formerly used for RAID support)


002f


4


10000000


key_length


0033


4


c0c30000


MYSQL_VERSION_ID from
include/mysql_version.h


0037


4


10000000


create_info->extra_size


003b


2


0000


Reserved for extra_rec_buf_length


003d


1


00


Reserved for default_part_db_type,
but 09 if MyISAM with partitioning


003e


2


0000


create_info->key_block_size

frm文件key信息部分

OffsetLengthValueExplanation


1000


1


00


Always 00 when there are no keys (that is, indexes)



??


??


??


101a


6


“MyISAM”


Name of engine. If partitioning, the partition clauses
are here

frm文件评论部分

OffsetLengthValueExplanation


202e


1


01


Length of comment


202f


40


“*”


The string in the COMMENT table
option

frm文件列信息部分

OffsetLengthValueExplanation


2100


2


01


Always


2102


2


0100


share->fields (number of columns)


2104


2


3b00


pos (“length of all
screens”). Goes up if
column-name length increases. Doesn’t
go up if add comment.


2106


2


0500


Based on number of bytes in row.


210c


2


0500


n_length. Goes up if row length
increases.


210e


2


0000


interval_count. Number of different
ENUM/SET columns.


2110


2


0000


interval_parts. Number of different
strings in
ENUM/SET columns.


2112


2


0000


int_length


211a


2


0100


share->null_fields. Number of
nullable columns.


211c


2


0000


com_length


2152


1


08


Length of column-name including ‘\0’
termination


2153


3


“column1\0”


column-name


215b


1


04


??


215c


1


03


??


215d


1


05


Number of bytes in column


215e


1


05


Number of bytes in column


215f


4


00020000


??


2163


1


00


Flags for zerofill, unsigned, etc.


2164


1


80


Additional flags, and scale if decimal/numeric


2168


1


fe


Data type (fe=char,
02=smallint,
03=int, etc.) see enum
field_types
 in
include/mysql_com.h


2169


1


08


Character set or geometry type


(later)


??


??


Column names again, defaults,
ENUM/SET strings,
column comments … at end of row. not shown.

分区表的.frm文件包含了分区信息,为了清楚,我们现在创建一个分区表,并且看看他的16进制数据有什么不同

mysql> CREATE TABLE table2 (column1 INT) ENGINE=MYISAM COMMENT '*'PARTITION BY HASH(column1) PARTITIONS 2;
Query OK, 0 rows affected (0.00 sec)

使用16进制格式输出:

00000000  fe 01 09 14 03 00 00 10  01 00 00 30 00 00 10 00  |...........0....|
00000010  05 00 00 00 00 00 00 00  00 00 00 02 08 00 08 00  |................|
00000020  00 05 00 00 00 00 08 00  00 00 00 00 00 00 00 10  |................|
00000030  00 00 00 c0 c3 00 00 3d  00 00 00 00 00 09 00 00  |.......=........|
00000040  2f 2f 00 00 20 00 00 00  00 00 00 00 00 00 00 00  |//.. ...........|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...
00001000  00 00 00 00 02 00 ff 00  00 00 00 00 00 00 00 00  |................|
00001010  ff 00 00 00 00 00 00 09  00 70 61 72 74 69 74 69  |.........partiti|
00001020  6f 6e 2a 00 00 00 20 50  41 52 54 49 54 49 4f 4e  |on*... PARTITION|
00001030  20 42 59 20 48 41 53 48  20 28 63 6f 6c 75 6d 6e  | BY HASH (column|
00001040  31 29 20 50 41 52 54 49  54 49 4f 4e 53 20 32 20  |1) PARTITIONS 2 |
00001050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...
00002000  76 01 00 10 00 00 00 00  00 00 00 00 00 00 00 00  |v...............|
00002010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00002020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 01 2a  |...............*|
00002030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...
00002100  01 00 01 00 3b 00 0b 00  00 00 05 00 0a 00 00 00  |....;...........|
00002110  00 00 00 00 00 00 50 00  16 00 01 00 00 00 00 00  |......P.........|
00002120  3b 00 02 01 02 14 29 20  20 20 20 20 20 20 20 20  |;.....)         |
00002130  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00002140  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 00  |               .|
00002150  04 00 08 63 6f 6c 75 6d  6e 31 00 04 08 0b 0b 00  |...column1......|
00002160  02 00 00 1b 80 00 00 00  03 08 00 00 ff 63 6f 6c  |.............col|
00002170  75 6d 6e 31 ff 00                                 |umn1..|
00002176

注意:00001010位置出现文本”CREATE TABLE … PARTITION“,就存储了分区信息

最后 CREATE VIEW 语句也会创建一个.frm文件,但是view的frm文件和普通的表不一样,而是一个纯文本文件,举个例子

mysql> CREATE VIEW v AS SELECT 5;
Query OK, 0 rows affected (0.00 sec)

16进制格式输出:

00000000  54 59 50 45 3d 56 49 45  57 0a 71 75 65 72 79 3d  |TYPE=VIEW.query=|
00000010  73 65 6c 65 63 74 20 35  20 41 53 20 60 35 60 0a  |select 5 AS `5`.|
00000020  6d 64 35 3d 38 64 39 65  32 62 62 66 64 35 33 35  |md5=8d9e2bbfd535|
00000030  66 35 37 39 64 34 61 39  34 39 62 39 65 62 37 64  |f579d4a949b9eb7d|
00000040  32 33 34 39 0a 75 70 64  61 74 61 62 6c 65 3d 30  |2349.updatable=0|
00000050  0a 61 6c 67 6f 72 69 74  68 6d 3d 30 0a 64 65 66  |.algorithm=0.def|
00000060  69 6e 65 72 5f 75 73 65  72 3d 72 6f 6f 74 0a 64  |iner_user=root.d|
00000070  65 66 69 6e 65 72 5f 68  6f 73 74 3d 6c 6f 63 61  |efiner_host=loca|
00000080  6c 68 6f 73 74 0a 73 75  69 64 3d 32 0a 77 69 74  |lhost.suid=2.wit|
00000090  68 5f 63 68 65 63 6b 5f  6f 70 74 69 6f 6e 3d 30  |h_check_option=0|
000000a0  0a 72 65 76 69 73 69 6f  6e 3d 31 0a 74 69 6d 65  |.revision=1.time|
000000b0  73 74 61 6d 70 3d 32 30  30 36 2d 30 39 2d 32 32  |stamp=2006-09-22|
000000c0  20 31 32 3a 31 34 3a 34  38 0a 63 72 65 61 74 65  | 12:14:48.create|
000000d0  2d 76 65 72 73 69 6f 6e  3d 31 0a 73 6f 75 72 63  |-version=1.sourc|
000000e0  65 3d 73 65 6c 65 63 74  20 35 0a                 |e=select 5.|

如果需要完整的资料可以去这里“传送门” 

这篇关于mysql 表结构定义文件frm的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/424076

相关文章

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二