笔记重点:
- windows下编译mysql,主要是要注意编译过程中遇到的各种编码问题;
- 与类unix平台不同的是可以用wolfssl代替,windows下只能使用openssl;
- 本笔记编译的mysql版本为8.0.18,版本比较新,所涉及到的依赖库有对应的版本,如用其他版本代替可能会出现无法预料的问题.
一. 源码下载
- 下载安装Visual Studio 2017
- 下载boost 1.70.0版本
- 下载cmake 3.15.4
- 下载openssl-1.0.2t
- 下载mysql-8.0.18
- 下载bison
二. 编译前准备工作
- boost_1_70_0文件夹解压到mysql-8.0.18\boost\下
- 按照 这个编译安装openssl库;添加OPENSSL_ROOT环境变量为openssl安装目录
- 安装bison;这个是生成mysql的内部sql语句要用的解析器,增加bison目录到系统path中
sql脚本更改:
mysql-8.0.18\scripts\fill_help_tables.sql中1
2
3
4
5
6
7
8
9-- SET NAMES 'utf8';改成utf8mb4
SET NAMES 'utf8mb4';
-- ...
-- 搜索PI行注释掉
-- INSERT INTO help_topic (help_topic_id,help_category_id,name,description,example,url) VALUES (160,13,'PI',
-- 搜索RADIANS注释掉这行
-- INSERT INTO help_topic (help_topic_id,help_category_id,name,description,example,url) VALUES (163,13,'RADIANS',mysql-8.0.18\scripts\mysql_system_tables.sql中
1
2
3
-- SET @cmd = "CREATE TABLE IF NOT EXISTS help_topic 这一行的编码格式由utf8改成utf8mb4
SET @cmd = "CREATE TABLE IF NOT EXISTS help_topic ( help_topic_id int unsigned not null, name char(64) not null, help_category_id smallint unsigned not null, description text not null, example text not null, url text not null, primary key (help_topic_id), unique index (name) ) engine=INNODB STATS_PERSISTENT=0 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin comment='help topics' ROW_FORMAT=DYNAMIC TABLESPACE=mysql";
三. 编译源码
3.1 建立源码外编译目录
1 | mkdir -p mysql-8.0.18\build && mysql-8.0.18\build |
3.2 使用cmake进行配置
在build目录生成MySQL.sln,以下用到的参数均可以在mysql的官方文档中找到;另外在这里没有特别配置的比较重要的选项是
DEFAULT_CHARSET默认值是utf8mb4,DEFAULT_COLLATION默认值为utf8mb4_0900_ai_ci,另外CMAKE_BUILD_TYPE的默认选项不是release,而是RelWithDebInfo.
1 | cmake .. -DCMAKE_INSTALL_PREFIX=F:\\mysql \ |
3.3 命令行编译MySQL.sln
这里需要说明的是,第一遍编译时会产生编译错误
- mysql-8.0.18\build\scripts\sql_commands_help_data.h
- mysql-8.0.18\sql\sql_local.cc
他们的代码页编码格式会导致编译错误;处理方式是先找出高级保存选项;然后将代码页保存Unicode 代码页 1200; - mysql-8.0.18\storage\innobase\api\api0api.cc的line 3309,line 3310的strtok_r改成strtok_s
命令行编译命令如下,如果机器配置好编译时间会短点.
1 | devenv.com MySQL.sln /Build "Debug|x64" |
四. 安装启动
安装命令1
devenv.com MySQL.sln /Build "Debug|x64" /project INSTALL
安装完成以后可以通过命令初始化数据库实例,使用—initialize和—initialize-insecure的区别是后者的root密码为空.
1 | mysqld --initialize-insecure --console |
结论:
可以参照mysqld启动流程也可以通过查看源码理解,mysql的系统表的初始化是通过内置的sql语句产生的.这个sql语句集中在build/scripts下.
比如文件sql_commands_help_data.h中,代码页中夹杂这sql语句,而sql语句又有编码格式问题,因此我不建议在windows平台下使用其他文本工具打开这个文件,通过上述提到的代码页保存方式为最保险的方式;目前mysql-8.0.18已经默认使用utf8mb4,如果使用原来的utf8(utf8mb3),插入宽字符时有可能遇到’Incorrect string value’错误.这是个非常值得注意的地方。