MySQL数据库出现乱码怎么解决
如何修改了系统编码了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# centos 6.x 版本是/etc/sysconfig/i18n 修改这个文件 shell> vim /etc/sysconfig/i18n # 这一行改为utf8 LANG=en_US.UTF-8 # 修改完,不要重启,立即生效如下 shell> source /etc/sysconfig/i18n # centos 7.x 版本是/etc/locale.conf 这个文件 [root@mysql-150 ~]# vim /etc/locale.conf LANG= "en_US.UTF-8" #立即生效 [root@mysql-150 ~]# source /etc/locale.conf |
- 数据库层面:
在参数文件中的[mysqld] 下,加入相应utf8字符集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
# 注意数据库的系统版本 5.6.x 和 5.7.x设置字符集参数不一样,8.x和5.7.x设置是一样的 #查看当前数据库的字符集参数,查看当前字符集参数 mysql> show variables like '%character%' ; # 查看数据库支持的字符编码,和编码的排序规则 mysql> show character set ; # 修改sutdents表中sname 字段的字符编码 mysql> alter table students modify sname varchar(66) character set gbk; Query OK, 3 rows affected (0.06 sec) Records: 3 Duplicates: 0 Warnings: 0 #看看表结构 mysql> show create table students; ... | students | CREATE TABLE `students` ( `sid` int (11) NOT NULL, `sname` varchar(66) CHARACTER SET gbk DEFAULT NULL, `sex` int (11) DEFAULT NULL, PRIMARY KEY (`sid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | ... # 查看连接级字符集和排序规则 mysql> show variables like '%collation%' ; +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +----------------------+-----------------+ |
从上面示例可以得出:
-
列级别字符集
-
表级别字符集
-
库级别字符集
-
mysql 实例字符集
1
2
3
4
5
6
7
8
9
10
11
|
vim /etc/my.cnf [mysqld] init-connect= 'SET NAMES utf8' character- set -server=utf8 然后去数据库操作: mysql> set @@global.character_set_server=utf8; Query OK, 0 rows affected (0.00 sec) mysql> set @@global.init_connect= 'SET NAMES utf8' ; Query OK, 0 rows affected (0.00 sec) # 注 用户操作的时候看看有没有super权限,对super用户权限 set names 不生效 |
有人说,修改完还是乱码, 这时候就乱码是哪个库的字符集,哪个表的字符集,哪个字段的字符集,还有操作系统字符集,程序连接的字符集,这些都的查看。
比如:
1
2
3
4
5
6
|
# 举例init_connect mysql> SET @@GLOBAL.init_connect='SET AUTOCOMMIT=0; set names utf8'; shell> vim my.cnf [mysqld] init_connect= 'SET AUTOCOMMIT=0;set names utf8' |
-
每个数据库客户端连接都有自己的字符集和排序规则属性,
客户端发送的语句的字符集是由character_set_client决定,
而与服务端交互时会根据character_set_connection和collation_connection两个参数将接收到的语句转化。当涉及到显示字符串的比较时,由collation_connection参数决定,
-
character_set_result参数决定了语句的执行结果以什么字符集返回给客户端
-
客户端可以很方便的调整字符集和排序规则,比如使用SET NAMES 'charset_name' [COLLATE 'collation_name']表明后续的语句都以该字符集格式传送给服务端,而执行结果也以此字符集格式返回。
set names 字符集
1
2
3
4
|
set names charset_name 语句相当于执行了以下三行语句: SET character_set_client = charset_name; SET character_set_results = charset_name; SET character_set_connection = charset_name; |
1
2
3
|
SET character_set_client = charset_name; SET character_set_results = charset_name; SET character_set_connection = @@character_set_database; |
数据库从: 全局数据库server字符集——>数据库字符集——> 表字符集——> 列字符集
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了