MySQL 5.7中文乱码与远程链接问题

  • 1. MySQL 5.7中文乱码
  • 2. 远程链接问题
  • 3. 不区分表大小写
  • 4. 超过最大连接数
  • 5. 时区问题
  • 5. GROUP BY 问题
  • 配置集合
  • 重启MySQL


1. MySQL 5.7中文乱码

当我们直接在数据库里面输入中文时,保存后出现:
Incorrect string value:‘\xE9.....’ for column '' at row 1

mysql字段内容中文转换为英文 mysql中文字符_数据库


出现上面的原因是因为字符编码设置有问题:

我们右击表设计,查看一下对应的字段:

可以看到字符集是latin1,我们可知MySQL5.7版本默认字符编码是latin1 这个字符集是不支持中文的,那我们怎么支持中文呢?

mysql字段内容中文转换为英文 mysql中文字符_数据库_02


支持中文的有:GBK、UTF8、UTF8mb4等

目前比较常用的是UTF8了,如果是有表情特殊字符需要用到UTF8mb4。

因为他们底层使用的存储大小不同:

字符编码

所占大小(字节)

latin1

1

gb2312

2

gbk

2

utf8

3

utf8mb4

4

PS:MySQL8.0之后默认就是utf8mb4 字符集了。

也可以使用语句查询:

SHOW CHARACTER SET;

mysql字段内容中文转换为英文 mysql中文字符_远程链接_03


所有我要修改一下默认字符集,

需要到C:\ProgramData\MySQL\MySQL Server 5.7下面修改my.ini文件。

默认情况下可以从上面查找。

如果不知道可以运行如下命令查看:

# 查看运行程序目录
select @@basedir;

# 查看数据库存储(配置文件在此上一层)
select @@datadir;

mysql字段内容中文转换为英文 mysql中文字符_sql_04

然后添加如下内容:
注意中括号里面的是配置其下面,不要复制过去。

[client]
default-character-set=utf8

[mysql]
# 配置默认字符集
default-character-set=utf8
 
[mysqld]
# 配置字符集和排序 
character-set-server=utf8
collation-server=utf8_general_ci

查看是否设置成功,
这个时候一定要注意,之前新建的数据库还是原来的字符集
需要新建数据库才能更改成默认的,如果不想新建需要一个一个修改指定的字段即可。

show VARIABLES like '%character%'

mysql字段内容中文转换为英文 mysql中文字符_sql_05

2. 远程链接问题

当我们本地电脑连接本地的数据库时是没有问题的,

如果是在一个局域网内,其他电脑访问就有问题了,

说明没有开启远程链接权限。

mysql字段内容中文转换为英文 mysql中文字符_数据库_06


参考文档:MySQL远程登录授权

# 允许root远程链接,并通过指定密码验证
grant all privileges on *.* to root@'%' identified by '123456';

执行完一下语句,其他电脑即可远程链接了。

mysql字段内容中文转换为英文 mysql中文字符_mysql字段内容中文转换为英文_07

mysql字段内容中文转换为英文 mysql中文字符_远程链接_08

3. 不区分表大小写

Windows默认是区分大小写的,
这时候需要修改MySQL的配置my.ini文件 ,
需要在mysqld节下加入:

[mysqld]
# 配置表名不区分大小写
lower_case_table_names=1

4. 超过最大连接数

如果你的MySQL服务器作为其他电脑的连接服务器,
有可能会出现连接超过最大连接数

show global variables like 'max_connect%';

执行上面的语句,我们可以看到到达100就会报错了。

所以我们要修改一下最大连接数。

mysql字段内容中文转换为英文 mysql中文字符_mysql字段内容中文转换为英文_09


解决方案:在mysqld下面添加如下设置

[mysqld]

max_connections = 2000

5. 时区问题

可以看到默认采用系统的时区,但是有可能系统时区有问题。

mysql字段内容中文转换为英文 mysql中文字符_sql_10

[mysqld]

default-time_zone = '+8:00'

5. GROUP BY 问题

[mysql]
# Group by会用到
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

[mysqld]
# Group by会用到
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

配置集合

[client]
default-character-set=utf8
[mysql]
# 配置默认字符集
default-character-set=utf8

# Group by会用到
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

[mysqld]
# 默认时区
default-time_zone = '+8:00'

# 配置字符集和排序 
character-set-server=utf8
collation-server=utf8_general_ci

# 服务端口
port=3306

# 主从id
server-id=1

# 配置表名不区分大小写
lower_case_table_names=1

# 最大连接数
max_connections=2000

# 数据库存储地址
datadir=C:/ProgramData/MySQL/MySQL Server 5.7/Data

# 存储引擎
default-storage-engine=INNODB

# Group by会用到
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

重启MySQL

经过上面的配置之后,需要重启MySQL:

mysql字段内容中文转换为英文 mysql中文字符_远程链接_11


mysql字段内容中文转换为英文 mysql中文字符_sql_12

mysql字段内容中文转换为英文 mysql中文字符_mysql_13