合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
### 1.1. Mysql安装教程 Mysql到现在已经有很多种安装方式,选择一种安装即可,Mysql也朝向“默认大于配置”的方向发展,安装越来越便利。 安装前请阅读一遍教程,安装过程中请确保每一步进行成功,不要盲目下一步。如果出现问题,很难排查,建议重装。 #### 1) 安装 mysql安装方式有如下几种: 这里也收集了一些不错的安装教程: 1. MSI版本安装 [MySQL8.0.11 MSI版 安装图解说明(opens new window)](https://blog.csdn.net/CSDN_Liang_1991/article/details/81035293) 2. ZIP版本安装 [mysql-8.0.11-winx64.zip安装教程详解(opens new window)](https://blog.csdn.net/zbajie001/article/details/80407944)[官方指南(opens new window)](https://dev.mysql.com/doc/refman/en/windows-start-service.html) 3. brew安装(mac) 若不考虑版本直接执行命令`brew install mysql`。 **重要:安装后请详细查看输出信息,这里会告诉你怎么启动mysql,以及一些其他说明!!!** ~~~ # 通常这些输出信息会告诉你如何启动mysql。 To have launchd start mysql now and restart at login: brew services start mysql # 设置为自动启动 Or, if you don't want/need a background service you can just run: mysql.server start # 手动启动一次 ~~~ 4. scoop安装(win) 使用[scoop(opens new window)](https://jiayaoo3o.github.io/2019/01/30/Windows%E4%B8%8B%E7%9A%84%E8%BD%AF%E4%BB%B6%E7%AE%A1%E7%90%86%E7%A5%9E%E5%99%A8-scoop/)直接安装mysql:`scoop install mysql`。 **重要:安装后请详细查看输出信息,这里会告诉你怎么启动mysql,以及一些包含初始化密码等其他说明!!!** 启动命令`net start mysql`,也可在服务界面点击鼠标启动。 进入后请修改初始化密码。 5. docker安装 ~~~ # 拉取 MySQL 镜像 docker pull mysql:latest # 运行容器 docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql # 参数说明: #-p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。 #MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。 ~~~ ##### 配置文件说明: 关于my.ini或着my.etc配置文件,大部分教程都是直接丢给你,我们以下面这个一一说明。 如果你使用mysql8,则如果不需要修改什么,直接不用配置文件即可,“约定大于配置”。 如果你使用mysql5.7,建议修改字符集相关设置。 ~~~ [mysqld] # 设置3306端口 port=3306 # 设置mysql的安装目录 basedir=C:/Users/w/scoop/apps/mysql/current # 设置mysql数据库的数据的存放目录 datadir=C:/Users/w/scoop/persist/mysql/data # 允许最大连接数 max_connections=200 # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统 max_connect_errors=10 # 服务端使用的字符集默认为UTF8 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB # 默认使用“mysql_native_password”插件认证 default_authentication_plugin=mysql_native_password [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [client] # 设置mysql客户端连接服务端时默认使用的端口 port=3306 default-character-set=utf8 ~~~ 上面的配置文件并不是都需要设置!!! ##### 举例: 我们以mysql zip 5.7版本举例说明, 这下面是我使用的配置文件以及安装命令。 ~~~ [mysqld] port = 33066 explicit_defaults_for_timestamp=true character-set-server=utf8 [client] default-character-set=utf8 ~~~ ~~~ # 安装命令 mysqld --initialize --console # 安装服务命令 mysqld --install mysql57 # 启动服务命令 net start mysql57 # 停止服务命令 net stop mysql57 # 删除服务命令 sc delete mysql57 ~~~ Mysql客户端 客户端也有很多种。有收费的,像大名鼎鼎的Navicat、Navicat for MySQL、SQLyog等。也有免费,像HeidiSQL、[MySQL Workbench(opens new window)](https://dev.mysql.com/downloads/workbench/)等。 收费的我也不想出钱,也不想在破解道路上斗智斗勇了。 所以选择免费的可以了。 直接使用[MySQL Workbench(opens new window)](https://dev.mysql.com/downloads/workbench/),这属于mysql官方出品,免费,功能强大,缺点英文界面。 #### 2) 注意事项 1. windows下需要VC++依赖,如果你没有安装,请下载安装。 Windows下可能提示缺少VC++201X,需要去[微软网站(opens new window)](https://visualstudio.microsoft.com/zh-hans/downloads)进行下载,在网页下面,不要傻乎乎的把VS2019下下来了。 2. 密码没有显示或者没看到。 在安装目录data文件中的.err文件中可以找到初始密码。对于scoop来说是scoop的persist\\MySQL路径下。 #### 3) 使用说明 1. 连接的驱动地址为"com.mysql.cj.jdbc.Driver" Mysql和mysql-connector都为8.0以上的版本时, 连接驱动就 不要再用: com.mysql.jdbc.Driver 要引用: com.mysql.cj.jdbc.Driver 2. 建立连接时url的一些参数 jdbc:mysql://localhost:3306/,这个东西后面跟的是数据库的名字,8.0.X以上的版本还需在数据库名后面加上这些东西 ?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true ### 1.2. 乱码之谜 一般由下面原因: 1)客户机没有正确地设置client字符集,导致原先的SQL语句被转换成connection所指字符集,而这种转换,是会丢失信息的,如果client是utf8格式,那么如果转换成gb2312格式,这其中必定会丢失信息,反之则不会丢失。一定要保证connection的字符集大于client字符集才能保证转换不丢失信息。 2)数据库字体没有设置正确,如果数据库字体设置不正确,那么connection字符集转换成database字符集照样丢失编码,原因跟上面一样。 乱码主要的原因就是编码字符集不兼容,默认情况下,我们只需要统一使用UTF8就可以了。 #### [](https://wonderwhyy.gitee.io/wdocs/pages/fccc0e/#_1-%E8%83%8C%E6%99%AF%E7%9F%A5%E8%AF%86)1) 背景知识: 1. 字符集和校验规则 字符集是一套符合和编码,校验规则(collation)是在字符集内用于比较字符的一套规则,即字符集的排序规则。MySQL可以使用对种字符集和检验规则来组织字符。 MySQL服务器可以支持多种字符集,在同一台服务器,同一个数据库,甚至同一个表的不同字段都可以指定使用不同的字符集。 每种字符集都可能有多种校对规则,并且都有一个默认的校对规则,并且每个校对规则只是针对某个字符集,和其他的字符集么有关系。 在MySQL中,字符集的概念和编码方案被看做是同义词,一个字符集是一个转换表和一个编码方案的组合。 Unicode(Universal Code)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,以满足跨语言、跨平台进行文本转换、处理的要求。 Unicode存在不同的编码方案,包括Utf-8,Utf-16和Utf-32。Utf表示Unicode Transformation Format。 2. 字符集选择规则 (1)编译MySQL 时,指定了一个默认的字符集; (2)安装MySQL 时,可以在配置文件 (my.cnf) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的; (3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时character\_set\_server被设定为这个默认的字符集; (4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character\_set\_server; (5)当选定了一个数据库时,character\_set\_database被设定为这个数据库默认的字符集; (6)在这个数据库里创建一张表时,表默认的字符集被设定为character\_set\_database,也就是这个数据库默认的字符集; (7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集; 3. MySQL数据库中字符集转换流程 1、MySQL Server收到请求时将请求数据从character\_set\_client转换为character\_set\_connection; 2、进行内部操作前将请求数据从character\_set\_connection转换为内部操作字符集,其确定方法如下: 使用每个数据字段的CHARACTER SET设定值; 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准); 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值; 若上述值不存在,则使用character\_set\_server设定值。 3、将操作结果从内部操作字符集转换为character\_set\_results。 ![](https://gitee.com/wonderwhyy/PicBed/raw/master/uPic/mysql20210302145211.png) #### [](https://wonderwhyy.gitee.io/wdocs/pages/fccc0e/#_2-%E5%B7%A5%E5%85%B7)2) 工具: 1. 查看当前数据库的字符集命令:`show variables like '%char%';`这个命令会查看数据库元数据的编码信息,如果你看到存在latin1,则需要修改配置。 ![](https://gitee.com/wonderwhyy/PicBed/raw/master/uPic/mysqlcharset.png) 变量名解释: character\_set\_client:客户端请求数据的字符集 character\_set\_connection:客户机/服务器连接的字符集 character\_set\_database:默认数据库的字符集这个变量建议由系统自己管理,不要人为定义。 character\_set\_filesystem:把os上文件名转化成此字符集,即把 character\_set\_client转换character\_set\_filesystem, 默认binary是不做任何转换的 character\_set\_results:结果集,返回给客户端的字符集 character\_set\_server:数据库服务器的默认字符集 character\_set\_system:系统字符集,这个值总是utf8,不需要设置。这个字符集用于数据库对象(如表和列)的名字,也用于存储在目录表中的函数的名字。 2. 查看当前数据库的校对规则命令:`show variables like 'collation%';` ![](https://gitee.com/wonderwhyy/PicBed/raw/master/uPic/mysql-collaction.png) 变量名解释: collation\_connection 当前连接的字符集。 collation\_database 当前日期的默认校对。每次用USE语句来“跳转”到另一个数据库的时候,这个变量的值就会改变。如果没有当前数据库,这个变量的值就是collation\_server变量的值。 collation\_server 服务器的默认校对。 排序方式的命名规则为:字符集名字\_语言\_后缀, 其中各个典型后缀的含义如下: 1)\_ci:不区分大小写的排序方式 2)\_cs:区分大小写的排序方式 3)\_bin:二进制排序方式,大小比较将根据字符编码,不涉及人类语言,因此\_bin的排序方式不包含人类语言 #### [](https://wonderwhyy.gitee.io/wdocs/pages/fccc0e/#_3-%E6%9F%A5%E7%9C%8B%E6%95%B0%E6%8D%AE%E5%AD%97%E7%AC%A6%E9%9B%86)3) 查看数据字符集: 1. 确定数据database、table、column字符集是不是正确的: ~~~ SELECT character_set_name, collation_name FROM information_schema.columns WHERE table_schema = your_database_name AND table_name = your_table_name AND column_name = your_column_name; ~~~ 2. 确定数据库存进去的数据是不是正确的: ~~~ SELECT HEX(column_name) FROM table_name; ~~~ 如果查出来3F,3F是字符'?'的16进制表示,这表明数据库里储存的是?。这种情况最常见的原因是在将特定字符从客户端字符集转换为目标字符集时出现了问题。 3. 确定往返是可能的。 ~~~ SELECT 'ペ' AS `ペ`; /* or SELECT _ucs2 0x30da; */ ~~~ 1 如果结果也不为ペ,则往返失败。 4. 确保问题出在浏览器或其他应用程序上,而不是MySQL。 使用mysql自带的命令行客户端程序完成上述步骤。如果mysql正确显示字符,但您的应用程序不能正确显示,则可能是由于系统设置引起的。 使用SHOW VARIABLES LIKE 'char%';查看系统设置: ~~~ mysql> SHOW VARIABLES LIKE 'char%'; +--------------------------+----------------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/mysql/charsets/ | +--------------------------+----------------------------------------+ ~~~ character\_set\_client:我们要告诉服务器,我给你发送的数据是什么编码? character\_set\_connection:告诉字符集转换器,转换成什么编码? character\_set\_results:查询的结果用什么编码? 如果以上三者都为字符集N,可简写为set names 'N'; 1. 临时设置:SET NAMES 'utf8' 2. 永久设置: ~~~ # 修改数据的配置文件my.cnf [mysqld] character-set-server=utf8 [client] default-character-set=utf8 ~~~ * * * #### 4)乱码终极解决方案: 1)首先要明确你的客户端时候何种编码格式,这是最重要的,这里我们将代码开发工具统一使用utf8 2)确保你的数据库使用utf8格式,很简单,所有编码通吃。 3)一定要保证connection字符集大于等于client字符集,不然就会信息丢失,比如: latin1 < gb2312 < gbk < utf8,若设置set character\_set\_client = gb2312,那么至少connection的字符集要大于等于gb2312,否则就会丢失信息 4)以上三步做正确的话,那么所有中文都被正确地转换成utf8格式存储进了数据库,为了适应不同的浏览器,不同的客户端,你可以修改character\_set\_results来以不同的编码显示中文字体,由于utf8是大方向,因此web应用是我还是倾向于使用utf8格式显示中文的。