学习了一段时间的mysql,感觉有必要总结、记录一下,以便以后查阅,同时作为一种参考,使后来的学习者少走弯路,快速进入“角色”。接下来的介绍并不仅仅讲操作步骤,穿插介绍了一些步骤后面的思想、原理,这样更有利于记忆、学习。
一、MySQL8.0.27 卸载、安装
即,将数据库在“机器上”卸载或安装。以MySQL8为例,MySQL5较新版可参考MySQL8。
如果以前自己的机器安装过 MySQL,就从“卸载”开始;否则从“安装”开始。
1、卸载MySQL
屏幕左下角输“cmd”,以管理员的身份打开cmd,“管理员:命令提示符”界面路径转到MySQL安装路径,如:cd D:\mysql-8.0.19-winx64\bin(安装过的老版mysql的路径,好像不修改路径也可以。)
A、停止MySQL服务。“管理员:命令提示符”界面输 net stop mysql后回车,提示“MySQL服务已成功停止”即可。如果提示“服务名无效”,可能是因为本机未安装MySQL。
**B、删除“MySQL安装目录”下的MySQL文件夹。**如之前在D盘上解压安装了mysql-connector-java-8.0.19,现在只需要删除mysql-connector-java-8.0.19文件夹即可。如果整体删不掉,就进入该夹,一部分一部分地删除。
C、“打扫”注册表。“管理员:命令提示符”界面输入regedit,进入注册表,删除以下文件夹:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQLD Service
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Application\MySQLD Service
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\MySQLD Service
文件夹数目可能少于三个,那就有几个删几个。
**D、查看名为mysql的服务。**以管理员身份运行,输入sc query mysql,出现如下界面即为正常。
**E、删除该mysql服务。**输入命令 sc delete mysql,出现 “[SC] Delet Service 成功”,卸载完成。
2、安装MySQL
采用“解压安装”的方式。从官网下载较新版本mysql-8.0.x-winx64.zip
**A、下载MySQL安装包。**从官网下载较新版本mysql-8.0.x-winx64.zip,具体方法:
https://dev.mysql.com/downloads/mysql/→选“Windows (x86, 64-bit), ZIP Archive”,点“Download”→点“No thanks, just start my download.”即可下载。
**B、解压安装包到目录。**建议解压到某盘的一级目录下,以便配置环境变量,如可解压到D:\mysql-8.0.27-winx64。
C、配置初始化文件。
.exe安装时,根据提示一步一步设置各种参数;解压安装通过这个my.ini初始化文件,一次性设置各种参数,这样可以减少麻烦,降低难度。
在刚刚解压的文件夹D:\mysql-8.0.27-winx64中新建一个my.ini文件,写入如下信息:(不同安装地址注意更改路径)
#mysqld是服务,d 的全拼应该是 daemon,也就是守护程序的意思,常驻于后台。
[mysqld]
# 设置3306端口
port=3306
# 设置 mysql 的安装目录
basedir=D:\mysql-8.0.27-winx64
# 设置 mysql 数据库的数据存放目录
datadir=D:\mysql-8.0.27-winx64\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数,这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端默认使用的字符集为utf8mb4
character-set-server=utf8mb4
# 使用 -skip-external-locking MySQL选项以避免外部锁定,该选项默认开启
external-locking = FALSE
# 创建新表时将使用的默认存储引擎
default-storage-engine=InnoDB
# 网上流传使用"mysql_native_password"插件(加密规则)认证,但是mysql8之后,
#默认加密规则是caching_sha2_password,仍用下面的规则,会出问题,
#default_authentication_plugin=mysql_native_password
#所以要将其注释掉,不设定,就是用默认的加密规则(即authentication_policy=caching_sha2_password)。
[mysql_safe]
log-error=D:\mysql-8.0.27-winx64\mysql_oldbody.err
pid-file=D:\mysql-8.0.27-winx64\mysql.pid
# 定义 mysql 应该支持的 sql 语法,数据校验
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysql]
# 设置 mysql 客户端(服务器?)默认字符集
default-character-set=utf8mb4
[client]
# 设置 mysql 客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
上面的初始化文件文件中,刚开始我使用了default_authentication_plugin=mysql_native_password,但接下来的“安装MySQL”操作,输mysqld --initialize --console时,出现如下提示
意思是“default_authentication_plugin”已弃用,并将在将来的版本中删除。要求改用authentication_policy(认证原则)。如果置之不理,在安装Navicat Premium 12连接MySQL数据库时会出现Authentication plugin ‘caching_sha2_password’ cannot be loaded的错误。此时有两种解决办法:
一种是通过改密码时将加密规则改回去:
cd D:\mysql-8.0.27-winx64\bin→ mysql -u root -p 回车(进入MySLQ数据库)→输原密码 回车→输“ ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘密码’;” 回车(改密码,也就是改加密规则为mysql_native_password)
另一种是升级或破解Navicat。升级需花钱,破解不安全,怎么办?使用HeidiSQL——一种适合数据库管理员的MySQL管理工具,免费,还先进,真香!别着急,随后慢慢介绍。
提示中还有两个警告:
研究了半天也没搞懂,好像跟网络有点关系,心里很不踏实,那位大神能给指点一下。
其实,不 配置初始化文件,安装MySQL也过,但是,这样配置一下,心里更加明白,可能也方便以后某些配置的修改吧。
**D、配置环境变量。**将环境变量中的系统变量(s)的路径名(Path)设置为D:\mysql-8.0.27-winx64\bin即可(安装位置不一样,路径也不一样)。此时配置环境变量,接下来的“命令提示符操作”会简单、省事一些。关于环境变量配置的操作,不熟悉可以百度搜索,很多的。
E、安装MySQL。“管理员:命令提示符”界面,路径转到MySQL安装路径,如:cd D:\mysql-8.0.27-winx64\bin,输入mysqld --initialize --console回车,出现如下界面:
其中最后显示的字符(不含空格):ubtqQrz:y4_+是系统给的数据库初始密码,要牢记,随后登录数据库、改密码要用到。
**F、安装MySQL服务。**数据库和数据库服务不一样。数据库可以理解成仓库及内部管理,一台主机的MySQL系统里,可能有几个库;数据库服务有点像调度,侦测、安排数据库需求。主机开机后,数据库服务就应该运行,伺服于后台,上连外界,下连数据库们,是数据库系统的一部分。
输入:mysqld --install 后,显示如下界面:
G、启动MySQL服务。
输入:net start mysql 显示如下界面:
H、登录MySQL系统。
输入:mysql -u root -p 此时就要输入刚才系统给出的初始密码了。 显示如下界面:
I、修改MySQL密码。
安装在主机的数据库系统应有若干用户,其中root是超级管理员(用户),拥有比一般用户大很多的权限。要改的密码应是超级管理员(root)访问数据库系统时的密码。输入(注意以下文本中的单引号均为西文上单引号(如图片中显示),若不是,输入时改过来):
ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH caching_sha2_password BY ‘000’;
其中root是mysql数据库用户中的超级管理员(数据库用户之一)。000是自己设定的对应的密码(复杂一些更安全,但要好记),输入时一定要用英文单引号括住,后面要加分号,再敲回车,如果没加分号,界面上会出“→”,这时敲一个分号,再敲回车即可。手动输入字符较多,容易出错,输入后一定小心核对,无误后再敲回车。显示界面:
若加密规则是mysql_native_password,则修改密码的命令是:
ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘密码’;
二、HeidiSQL安装
HeidiSQL是一种适合数据库管理员的MySQL管理工具,免费,还先进,对于数据库的日常管理已经够用了。
1、下载。
https://www.heidisql.com/download.php→“Installer,32/64 bit combined(SHA1 checksum)”
下载文件名字形如:HeidiSQL_11.3.0.6295_Setup.exe
2、安装
双击图标→选择英文,ok→I accept…next→默认安装地址,next→开始菜单中建文件夹,next→选中额外任务,next→Install→finish启动程序,显示会话器,如下图:
点“新建”→左侧“Unnamed”处输入自己想要的会话名称→右侧输密码→点打开,如下图:
3、建库(非必要步骤)。
创建数据库不止一种方式。如需建库,右键左上部的会话名称→创建新的(O)→数据库(S),出现如下界面:
输入名称,选择字符校对选项就,点确定即可。
MySQL5、MySQL8是两条线,两个版本系列,各有优缺,现在都有最新更新版本,但新建数据库建议使用MySQL8。
其中字符校对选项可utf8mb4_09000_ai_ci。而MySQL-5系列使用的是utf8_general_ci,若用以前的老数据库文件建库用了MySQL-5系列版本,可选此模式(可使用较新版本,如mysql-5.7.42-winx64)。使用MySQL-8系列建库时,服务器默认的是utf8mb4_09000_ai_ci(包含utf8_general_ci),此模式下的数据库文件占空间多,若使用MySQL-5的文件设成此模式,可能会出一些错误提示。但使用utf8mb4是潮流,新建数据库可使用utf8mb4_09000_ai_ci选项。
4、批量建表(非必要步骤)。
如下图,左边选择要建表的数据库(如abcbase),右侧点查询图标(蓝三角),将建表的文本输入其中,点最上边变蓝的三角,即可。若数据库找不到新建的表,点一下左上的刷新图标即可。
5、excel导入(非必要步骤)。
将数据放入excel表,由excel表“另存为”CSV格式,HeidiSQL中通过CSV文件,将数据导入到数据库表中,详细过程如下:
A、将数据放入excel表中。
对于载有数据的excel工作簿,不要直接用其生成CSV格式的文件,而应该再创建一个“中转”工作簿,用来“净化”文件,即:
新建一个excel工作簿,删除其中多余的Sheet,只留一个Sheet。在原来的用于输入数据的工作簿中,只选字段和数据,选中目标区域(不可多选行、列),复制粘贴到新簿Sheet中,开始位置(Sheet中第几行、第几列)自定,如图:
字段和数据行之间不要有空行,列和列之间不要有空列,否则通过HeidiSQL往数据库导入数据时会出现奇怪的现象。
B、生成CSV格式的文件。
新工作簿中,点“文件”→另存为→保存类型选“CSV(逗号分隔)(*csv)”,命名→点保存、确定、是……如图:
之所以建中转工作簿是因为,在“转成CSV”的动作中,会将工作簿中最左、最上的数据所在列、行,作为CSV簿Sheet表的A列、1行,如图:
而HeidiSQL往数据库导入数据时,是从CSV表的“被忽略行”之后的行开始导入数据。老工作簿在输入数据时,目标数据区域之外可能还有其它一些辅助输入,如表名、字段注释等,或者误输入,如空格(误输入后还看不见),总之,不是绝对干净。若不做处理,这些东西就会一并加入生成的CSV表,并进一步导入数据库,造成数据库数据错误、错乱。
新添加的数据往往后部追加,因此生产的SCV表上部的某几行应该忽略掉(即不导入它们),待会儿导入数据选“忽略行”时应选SCV表中(而不是其它excel表)忽略的行数。比如本SCV表属于第一次导入数据,需要忽略的是前一行(字段行),而不是excel中转表的前三行(或其它什么行)。
C、CSV表导入数据库。
HeidiSQL中,选中要导入数据的表→点左上“工具”,导入CSV文件→输入辅助参数后,界面如下:
选择服务器解析数据(LOAD DATA)→选择编码方式:gb2312: …(excel2003编码格式)→点“导入”→点“刷新”(上部绿圈)→点“数据”(上部偏左),可以看到数据已导入数据库表中:
D、导入注意事项。
a、上图1处:文件路径、文件名中尽量不要包含汉字,否则某些版本可能报错:not found(Errcode:2)
b、上图2处:如前面的分析,应选择“忽略前1行”,否则,导入数据库的数据有可能错乱。
c、上图3处:选择服务器解析数据(LOAD DATA)。
d、导入过程中,有可能出现错误提示:Loading local data is disabled; this must be enabled on both the client and sever sides:本地数据无法导入,必须要"同时获得客户端和服务器端的许可",即mySQL数据库出于安全问题的考虑,禁用本地数据。解决方法有二:
方法一:“管理员:命令提示符”界面修改local_infile=‘ON’,如图:
方法二(此法有时会失效,有待于继续研究):MySQL配置文件my.ini中,[mysql]、[mysql] 和[client] 下面,都添加上 local_infile=ON,随后关闭服务再启动服务即可(此法持久,但有一定安全风险),如图:
三、eclipse中JDBC驱动(mysql-connector-java-8.0.27.jar)的添加
1、对JDBC驱动的理解。
Java应用程序通过JDBC(Java DataBase Connectivity,Java数据库连接技术)连接数据库。其实JDBC就是一组API:只提要求,不去“代码实现”要求。实现“要求”的任务交给了各数据库厂商。比如JDBC API中提出了“查询”要求,MySQL厂家就会在对应的JDBC驱动中落实这一任务:Java方法的壳,内部可能是C、C++的“手”,伸向数据库内部去掏数据。其它数据库厂商也是这个原理。使用eclipse制作项目时,将JDBC驱动导入eclipse,就会在“需要”时,驱动中的方法覆盖接口中的抽象方法,从而实现某一功能。因此,eclipse中导入JDBC驱动是“Java应用程序”中加载JDBC驱动的前提。
JDBC驱动使用的名字就是mysql-connector-java-…有些奇怪,明明是驱动(driver),怎么搞成了连接者(connector)?好吧,现实就是这样。
2、eclipse中JDBC驱动(mysql-connector-java-8.0.27.jar)应放在哪里?
mysql-connector-java-8.0.27.jar是一个库 (或一个敞口瓶子,或坛子),里面包含各种类、方法。它应该被放在两个位置:
一、项目工程下,或项目工程下的某个文件夹中,防丢,以备引入项目;
二、项目工程下的“引用库”(Referenced Libraries)中,以备应用程序引用。mysql-connector-java-8.0.27.jar是一个外部库,又要被程序引用,所以又应该放在“引用库”中。
第一个位置是需要我们直接手动放进去,第二个位置是经过我们的一番操作后,系统放进去的(无“引用库”,系统会自建)。
3、mysql-connector-java-8.0.27.jar的添加。
A、下载。
https://downloads.mysql.com/archives/c-j/→Product Version中选择目标版本(自己想要的版本,如8.0.27)→Referenced libraries “Select Operating System:”下拉菜单中选中“Platform Independent”→选中下边zip格式的文件,点“Download”即可下载。
驱动的版本要与数据库版本一致,即数据库:mysql-8.0.27-winx64.zip;驱动:mysql-connector-java-8.0.27
B、将驱动添加进工程。
打开eclipse。解压mysql-8.0.x-winx64.zip,将其中的文件mysql-connector-java-8.0.27.jar复制粘贴到eclipse项目下(也可以项目下建lib文件夹,复制到此夹中)即可,复制后如下图:
C、将驱动加入“引用库”(Referenced Libraries)。
点击选中项目(本例TestService)→File→Properties(或Project→Properties)→Java Build Path→Libraries,如下图:
→点Add JARs→跳出的JAR Selection对话框中打开项目夹(TestService)→点击刚才添加的文件mysql-connector-java-8.0.27.jar如下图:
→点OK→点Apply and Close→打开左侧刚刚增加的Referenced Libraries(系统自动建),可以看到驱动已经添加进“引用库”中,如下图:
至此,eclipse中JDBC驱动(mysql-connector-java-8.0.27.jar)已添加完毕。
4、Java应用程序中,加载JDBC驱动、设置连接中的url。
即Java“应用程序中的”一些动作,对外联系机器中安装的数据库程序。“加载JDBC驱动”这一“动作”一般位于服务器的服务器程序中。
A、首先搞清楚MySQL中的“服务端”、“客户端”。
服务端可以理解为机器上安装的数据库系统;客户端可以理解为向数据库系统发出数据请求并使用数据的系统。有些服务器程序虽然与数据库系统装在一台机器上,但也可以看作是“客户端”,这与我们平常理解的“服务端(器)-客户端”有点不一样。
B、其次要搞懂字符集(character set)和对应的“处理规则”(collation)。
字符集里包含着各种字符,且还会不断更新,如加入表情标志。以utf8mb4_0900_ai_ci为例,其中utf8mb4_0900,代表字符集utf8mb4的0900版本(即Unicode 9.0)。字符集大致说明了集合内包含哪些字符,每个字符的编码是多少。
“处理规则”是指如何“处置”这些编码,即如何定义、存储、传输、转换这些编码。utf8mb4_0900_ai_ci就是这样一个规则:UTF的全名是Unicode Transformation Format,也就是“Unicode变换格式”。其中的“8”既是指字符最少只需8位(一个字节),也是指以8位为一组实现了可变字节数的字符编码。mb4表示一个字符最多使用4个字节来存储。0900表示字符集版本号。ai、ci分别表示“不区分音调”、“不区分大小写”。综上,utf8mb4_0900_ai_ci更是一种字符集对应的“处理规则”。
在字符集utf8mb4中,英文占一个字节(8位),中文占3个字节,特殊符号支持4个字节。1byte(字节)=8bit(位,如0或1)。
使用数据库管理工具Navicat创建数据库时,要选择字符集:utf8–UTF-8 Unicode、整理(“处理规则”):utf8_general_ci;而使用HeidiSQL建库时,字符校对(“处理规则”)选择utf8mb4_0900_ai_ci,其中也暗含了字符集Unicode 9.0。
C、加载JDBC驱动。
Class.forName("com.mysql.cj.jdbc.Driver");
类com.mysql.cj.jdbc.Driver位于JDBC驱动(mysql-connector-java-8.0.27.jar)中。Class.forName()方法是在虚拟机中创建com.mysql.cj.jdbc.Drive的Class的对象(这个对象是该驱动的唯一对象,且位于虚拟机中),并同时执行com.mysql.cj.jdbc.Driver中的静态方法,而com.mysql.cj.jdbc.Driver中的静态方法又向DriverManager注冊自己:
//下面的写法可能不太规范,为了便于理解,暂且这样写
//前一个Driver位于JDBC驱动中,后一个Driver位于JDBC(是接口)中。
public class com.mysql.cj.jdbc.Driver implements java.sql.Driver {
...
static{
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
}
...
}
这相当于在内存中创建了com.mysql.cj.jdbc.Driver的实例对象。这就实现了覆盖JDBC接口,加载JDBC驱动的目的。具体Class类、Class.forName用法的介绍可参考:
https://juejin.cn/post/6844903687265976334
D、设置连接中的url。
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb"
+"?useUnicode=true&character_set_server=utf8mb4"
+"&user=root(用户名)&password=密码"
+"&useSSL=true(使用SSL连接)");
其中的testdb是你的数据库的名称,不要写出会话名称。在HeidiSQL中,用户(名,root)–会话–数据库–表,其隶属关系如是。
useUnicode=true,说明要使用Unicode字符集,做了这个设置,接下来的character_set_server=utf8mb4才会生效。
数据库服务端使用的字符集是utf8mb4,这是在安装数据库时,初始化文件my.ini中设定的。作为应用程序的客户端(服务器、远程终端)向数据库传输数据时,也应“要求”数据库系统将这些数据“存成”utf8mb4格式,从数据库系统输出时,也应输出为utf8mb4格式。也就是对数据库编码、解码的要求。官方也建议character_set_server=utf8mb4的值的配置尽量与mysql服务端的编码一致。
客户端是一个系统,有自己的字符集;数据库系统也有自己的字符集,两个系统进行信息传递时,针对字符集,应该有翻译(编码、节码)的环节。
四、总结
MySQL安装,HeidiSQL安装、JDBC驱动(mysql-connector-java-8.)添加,这三项工作完成后,数据库基本上就可以使用了。
这些工作很长时间也不一定做一次,并且头绪又多,一旦某个软件出现变化,就会手足无措,如果能把这些过程记下来,后来的工作就会简单多了,高效多了。
同时也不仅仅是记录操作过程,其中有很多细节要注意,要悟透一些原理,要学习一些知识,要组织一些文字,一篇博客写下来,觉得强壮了许多,清楚了许多,收获了许多。记得硬着头皮写第一篇博客时,感觉举步维艰,左右为难,动弹不得,坚持到现在,多少有些“入门感”,轻松自由不少。
所以,博客一定要坚持写下去!还是那句话,对付困难的最好方法:不要停下来。
最后,本文中的名词、原理、方法的表述可能有不当甚至错误,参考时应加以甄别,去伪存真。同时也请看到本文的大神、高手们不吝赐教,多多指点。