概述
在MySQL数据库中,每个库对应的数据目录下,几乎都会自动生成一个名为 db.opt 的小文件。这个文件在创建数据库时自动产生,平时存在感很低,但如果用文本编辑器打开,会发现内容非常简单——仅包含两行配置:一行记录着该库的默认字符集编码,另一行记录着对应的排序规则。许多有经验的开发者可能早已注意到这一点,但对于刚接触MySQL的朋友来说,或许会好奇这个文件到底有什么作用?如果丢失了是否会影响数据库正常运行?本文将详细解析 db.opt 文件的功能与重要性。
db.opt 文件的作用
每个数据库对应的目录中,都会存在一个 db.opt 文件。简单来说,该文件存储了当前数据库的默认字符集(character set)和字符校验规则(collation)。例如:
default-character-set=utf8
default-collation=utf8_general_ci
内容非常直观。当创建数据库时,如果没有手动指定字符集和校验规则,系统会使用全局默认值并将其写入该文件。后续在该数据库中创建表时,如果建表语句中同样没有指定字符集和校验规则,表将默认继承 db.opt 中记录的设置。
MySQL源码中的实现也清晰说明了这一点:
/* Set table default charset, if not set
SYNOPSIS
set_table_default_charset()
create_info Table create information
DESCRIPTION
If the table character set was not given explicitely,
let's fetch the database default character set and
apply it to the table. */
static void set_table_default_charset(THD *thd,
HA_CREATE_INFO *create_info,
char *db)
{
if (!create_info->default_table_charset)
{
HA_CREATE_INFO db_info;
load_db_opt_by_name(thd, db, &db_info);
create_info->default_table_charset=
db_info.default_table_charset;
}
}
简单来说,当建表语句未指定字符集时,MySQL会读取 db.opt 中的默认值作为表的字符集设置。这就是该文件的核心作用。
字符集与校验规则的配置
在创建数据库时,可以显式指定字符集和校验规则,示例如下:
create database if not exists test
default charset utf8
default collate utf8_general_ci;
如果在创建后需要修改,可以使用 alter database 命令进行更改:
alter database test
default charset latin1
default collate latin1_swedish_ci;
创建数据库的完整语法是:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
当然,修改数据库的语法类似:
ALTER {DATABASE | SCHEMA} [db_name]
alter_specification ...
alter_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
总结与注意事项
第一,创建数据库时会自动生成 db.opt 文件,其中保存的是该数据库的默认字符集。执行 show create database 命令所显示的默认字符集,正是从 db.opt 文件中读取的。
第二,删除或丢失该文件不会导致数据库崩溃。但是,当该文件缺失后,新建表时由于找不到库级别的默认字符集,系统会使用全局变量 character_set_server 的值作为替代。此时执行 show create database 显示的是 character_set_server 的值,而非用户之前设定的库默认值。
换言之,db.opt 虽然是个不起眼的小文件,但其缺失会导致库级默认设置退化为实例级默认,在细节上可能引发问题。因此,在日常备份或迁移数据库文件时,建议一并携带该文件。

