热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL出现乱码怎么办?(字符集的理解)上

首先回答题目,可以直接在MySQL黑框里面设置输入SETNAMESGBK;文章目录1.字符集1.1字符集简介1.2常见字符集1.3字符集比较2.MySQL中支持的字符

首先回答题目,可以直接在MySQL黑框里面设置输入SET NAMES GBK;

文章目录

  • 1. 字符集
    • 1.1 字符集简介
    • 1.2 常见字符集
    • 1.3 字符集比较
  • 2. MySQL中支持的字符集和排序规则
    • 2.1 MySQL中的utf8和utf8mb4
    • 2.2 MySQL中支持哪些字符集
    • 2.3 比较规则的查看
    • 3.3 不同级别的字符集和比较规则
      • 3.3.1 服务器级别
      • 3.3.2 数据库级别
      • 3.3.3 表级别
      • 3.3.4 列级别
      • 3.3.5 修改字符集
      • 3.3.6 小结


1. 字符集

1.1 字符集简介


  • 将一个字符映射成一个二进制数据的过程叫做 编码 ,将一个二进制数据映射到一个字符的过程叫做 解码。
  • 人们抽象出一个 字符集 的概念来描述某个字符范围的编码规则
  • 不同字符集有不同的字符范围,也就是说不同字符集能表示的不一样多

1.2 常见字符集


  • ASCII 字符集
    共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码,我们看一些字符的编码方式:
    ‘L’ -> 01001100(十六进制:0x4C,十进制:76)
    ‘M’ -> 01001101(十六进制:0x4D,十进制:77)

  • ISO 8859-1 字符集
    共收录256个字符,是在 ASCII 字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。这个字符集也有一个别名 latin1 。

  • GB2312 字符集
    收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个。同时这种字符集又兼容 ASCII 字符集,所以在编码方式上显得有些奇怪:

    • 如果该字符在 ASCII 字符集中,则采用1字节编码。
    • 否则采用2字节编码。

    这种表示一个字符需要的字节数可能不同的编码方式称为 变长编码方式 。比方说字符串 ‘爱u’ ,其中 ‘爱’ 需要用2个字节进行编码,编码后的十六进制表示为 0xCED2 , ‘u’ 需要用1个字节进行编码,编码后的十六进制表示为 0x75 ,所以拼合起来就是 0xCED275 。

    我们怎么区分某个字节代表一个单独的字符还是代表某个字符的一部分呢?别忘了ASCII字符集只收录128个字符,使用0~127就可以表示全部字符,所以如果某个字节是在0~127之内的,就意味着一个字节代表一个单独的字符,否则就是两个字节代表一个单独的字符。

  • GBK 字符集
    GBK 字符集只是在收录字符范围上对 GB2312 字符集作了扩充,编码方式上兼容 GB2312

  • utf8 字符集
    收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容 ASCII 字符集,采用变长编码方式,编码一个字符需要使用1~4个字节,比方说这样:

    ‘L’ -> 01001100(十六进制:0x4C)
    ‘啊’ -> 111001011001010110001010(十六进制:0xE5958A)

说明:汉字在utf8中占3个字节,而在gbk中占2个字节

1.3 字符集比较


  • 通过二进制编码来进行比较,比如’a’是小于’b’的
  • 忽略大小写进行比较,如’a’和’A’是相等的,通常情况下,可以将大小写不同的字符转化为大写或者小写,再进行二进制比较

2. MySQL中支持的字符集和排序规则

2.1 MySQL中的utf8和utf8mb4

常用的一些字符使用1~3个字节就可以表示

  • utf8mb3 :阉割过的 utf8 字符集,只使用1~3个字节表示字符。
  • utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符。

在 MySQL 中 utf8 是 utf8mb3 的别名,所以之后在 MySQL 中提到 utf8 就意味着使用1~3个字节来表示一个字符.如果大家有使用4字节编码一个字符的情况,比如存储一些emoji表情啥的,那请使用 utf8mb4 。


2.2 MySQL中支持哪些字符集

输入:SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式];
在这里插入图片描述
其中的 Default collation 列表示这种字符集中一种默认的比较规则 。最后一列 Maxlen ,它代表该种字符集表示一个字符最多需要几个字节。重要的几种字符集的Maxlen如下,
在这里插入图片描述

2.3 比较规则的查看

输入:SHOW COLLATION [LIKE 匹配的模式];
例子:
在这里插入图片描述

  • Collation字段中,前缀都是以utf8,表示utf8的比较规则。
  • Collation字段中间的,如general表示一种通用的比较规则, utf8_polish_ci 表示以波兰语的规则比较。
  • 名称后缀意味着该比较规则是否区分语言中的重音、大小写。
  • Default字段表示默认比较规则,从图上看出,utf8的默认比较规则是 utf8_general_ci

后缀英文释义描述
_aiaccent insensitive不区分重音
_asaccent sensitive区分重音
_cicase insensitive不区分大小写
_cscase sensitive区分大小写
_binbinary以二进制方式比较

3.3 不同级别的字符集和比较规则

MySQL 有4个级别的字符集和比较规则,分别是:

  • 服务器级别
  • 数据库级别
  • 表级别
  • 列级别

3.3.1 服务器级别


  • 两个系统变量:
    在这里插入图片描述
  • 查看这两个系统变量:
    在这里插入图片描述

3.3.2 数据库级别


CREATE DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];


ALTER DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];

两个系统变量:
在这里插入图片描述

  • character_set_database 和 collation_database 这两个系统变量是只读的,我们不能通过修改这两个变量的值
    而改变当前数据库的字符集和比较规则。

3.3.3 表级别


CREATE TABLE 表名 (列的信息)
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称]]


ALTER TABLE 表名
[[DEFAULT] CHARACTER SET 字符集名称]
[COLLATE 比较规则名称]


  • 如果创建和修改表的语句中没有指明字符集和比较规则,将使用该表所在数据库的字符集和比较规则作为该表的字符集和比较规则。

3.3.4 列级别


  • 对于存储字符串的列,同一个表中的不同的列也可以有不同的字符集和比较规则。

CREATE TABLE 表名(
列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称],
其他列…
);


  • 如果在创建和修改的语句中没有指明字符集和比较规则,将使用该列所在表的字符集和比较规则作为该列的字符集和比较规则

临时转化字符集,可能导致错误发生


3.3.5 修改字符集

由于字符集和比较规则是互相有联系的,如果我们只修改了字符集,比较规则也会跟着变化,如果只修改了比较规则,字符集也会跟着变化,具体规则如下:

  • 只修改字符集,则比较规则将变为修改后的字符集默认的比较规则。
  • 只修改比较规则,则字符集将变为修改后的比较规则对应的字符集

不论哪个级别的字符集和比较规则,这两条规则都适用。


3.3.6 小结


  • 如果创建或修改列时没有显式的指定字符集和比较规则,则该列默认用表的字符集和比较规则
  • 如果创建或修改表时没有显式的指定字符集和比较规则,则该表默认用数据库的字符集和比较规则
  • 如果创建或修改数据库时没有显式的指定字符集和比较规则,则该数据库默认用服务器的字符集和比较规则
  • 一个汉字在gbk中占两个字节,在utf8中占3个字节

推荐阅读
  • mysql字符集和表字符集_Mysql数据库表引擎与字符集
    Mysql数据库表引擎与字符集1.服务器处理客户端请求其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句) ... [详细]
  • 在QQ群里问了一些高手,同时参考了这篇文章:http:huangyunbin.iteye.comblog1113983,终于把这个问题搞定了。首先,我用的是zip包的Mysql,直接解压使 ... [详细]
  • 在互联网公司中,MySQL是使用最多的数据库,那么在并发量大、数据量大的互联网业务中,如何高效的使用MySQL才能保证服务的稳定呢?根据本人多年运维管理经验的总结,梳理了一些核心的 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 1.socket消息发送importjava.net.ServerSocketimportjava.io.PrintWriterimportscala.collection.mut ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • Postgresql备份和恢复的方法及命令行操作步骤
    本文介绍了使用Postgresql进行备份和恢复的方法及命令行操作步骤。通过使用pg_dump命令进行备份,pg_restore命令进行恢复,并设置-h localhost选项,可以完成数据的备份和恢复操作。此外,本文还提供了参考链接以获取更多详细信息。 ... [详细]
  • 请教大家一个javaweb方面的问题·········
    问题问题是这样的,jsp页面统一采用的是GBK的编码格式。web服务器使用的是JBOSS。在如下查询页面中输入中文的查询条件:在点击下一页的时候,要求查询条件也进行回显。但是会出现 ... [详细]
  • PHP连接MySQL的2种方法小结以及防止乱码【PHP】
    后端开发|php教程PHP,MySQL,乱码后端开发-php教程PHP的MySQL配置报错信息:ClassmysqlinotfoundinAnswer:1.在confphp.ini ... [详细]
  • PHP操作MySql数据库_PHP教程:链接数据库$conn@mysql_connect(localhost,root,88888888)ordie(链接错误);解决中文乱码mys ... [详细]
author-avatar
桃花岛的小米_992
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有