MySQL2.字符集乱码
MySQL2.字符集
此节记录下MySQL出现乱码的原因。还是参考小册子~
字符集简介
计算机中只能存储二进制数据,建立字符与二进制数据的映射关系来存储字符。
从两方面考虑:
1.界定清楚字符范围,即哪些字符映射成二进制数据
2.怎么映射
将一个字符映射成一个二进制数据的过程叫做编码,将二进制数据映射到字符叫做解码。
人们抽象出一个字符集的概念来描述某个字符范围的编码规则。如用0001代表a字符
重要的字符集
- ASCII
共128个字符,使用1个字节来编码 - ISO 8859-1 latin1
256个字符 - GB2312
兼容ASCII,采用变长编码方式(表示一个字符需要的字节数可能不同),2个字节 - GBK
只是对GB2312作了扩充 - utf8
收录地球上所有能想到的字符,采用变长编码,一个字符需要使用1~4个字节。
MySQL中支持的字符集和排序规则
utf8 utfmb4
在MySQL中字符集表示一个字符所用最大字节长度在某些方面会影响系统的存储和性能。
所以MySQL中定义了两个概念:
- utf8mb3:只使用1~3个字节表示字符,即utf8
- utf8mb4:使用1~4个字节表示字符
字符集和比较规则的应用
各个级别的字符集和比较规则
MySQL有4个级别的字符集和比较规则
- 服务器级别
- 数据库级别
- 表级别
- 列级别
服务器级别:可以在启动服务器程序时通过启动选项或者在服务器程序运行过程中修改如下配置,
character_set_server=gbk
collation_server=gbk_chinese_ci
数据库级别:在创建和修改数据库的时候可以指定字符集和比较规则。
CREATE DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
ALTER DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
SHOW VARIABLES LIKE 'character_set_database';
表级别:在创建和修改表的时候指定。如果没有指定,则默认使用该表所在的库的字符集。
列级别:对于存储字符串的列,同一个表中的不同列也可以有不同的字符集和比较规则。
CREATE TABLE 表名(
列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称],
其他列...
);
ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];
修改字符集或仅修改比较规则
字符集和比较规则是互相有联系的
- 只修改字符集,比较规则将变为修改后的字符集默认的比较规则
- 只修改比较规则,字符集将变为修改后的比较规则的字符集
MySQL客户端和服务器通信中的字符集
从MySQL客户端向服务器发送请求到返回结果这个过程中经过3个系统变量:
- character_set_client 请求时使用的字符集
- character_set_connection 服务器处理请求时会把请求字符串从character_set_client转为character_set_connection
- character_set_results 服务器向客户端返回数据时使用的字符集
服务器认为客户端发送过来的请求时用character_set_client;
服务器将把得到的结果集使用character_set_results返回给客户端;
character_set_connection只是服务器在将请求的字节串从character_set_client转换为character_set_connection时使用,要注意的是该字符集包含的字符范围一定涵盖请求中的字符。
为此,MySQL提供了set names 字符集名来统一这3个字符。
比较规则
作用通常体现在比较字符串大小的表达式以及某个字符串列进行排序,所以也称为排序规则。
MySQL2.字符集乱码的更多相关文章
- MySQL字符集乱码详解
对于MySQL数据库中出现乱码经常是新手碰到的一个头痛的问题,不知道为什么经常出现中文乱码. 1.对于所谓的数据库中乱码,其实这中说法是错误的,只是我们不认识服务器给我们的字符.其实还是原来的字符?那 ...
- mysql proxy 数据库读写分离字符集乱码
mysql proxy 数据库读写分离字符集乱码 解决办法 在对应配置后端数据库服务器的配置.cnf中加入如下代码 init-connect='SET NAME UTF8' skip-characte ...
- springboot字符集乱码
入门扫盲:https://www.2cto.com/database/201701/584442.html 1.修改springweb类bug 2.数据库连接配置 3.数据库字符集 https://w ...
- 常见字符集&乱码问题
字符集 常用字符集分类 ASCII及其扩展字符集 作用:表语英语及西欧语言. 位数:ASCII是用7位表示的,能表示128个字符:其扩展使用8位表示,表示256个字符. 范围:ASCII从00到7F, ...
- MySQL字符集乱码
学数据库,最让人丧气的就是字符集的问题了,一旦出问题,就会有砸电脑的冲动,特别是在修改很多次字符集后依然不成功的时候! 我用的数据库软件是MySQL 5.1.28.最初出问题的时候,是这样的: 情景一 ...
- 字符集乱码问题:ISO-8859-1和GBK
问题,引用百度知道的问题吧: http://zhidao.baidu.com/question/51342167.html?qbl=relate_question_0&word=%C3%84% ...
- mysql字符集乱码问题
程序错误截图如下: 分析:我们mysql数据库没有设置默认编码, 导致创建的库字符集为 latin1,然而我们创建表的时候,指定字符集为其他的,比如utf8 我的解决思路:把数据库的编码修改为utf8 ...
- Python 爬虫 字符集乱码问题
解决办法: http://worldant.blog.sohu.com/251745784.html 爬虫爬下来的源代码和网页的源代码不一样,可以先把爬下来的代码输出或保存在文件中,然后再写正则匹配表 ...
- MYSQL 解决中文字符集乱码问题的方法
修改 /etc/mysql/my.cnf 增加内容 [client] default-character-set = utf8mb4 [mysql] default-character-set = u ...
随机推荐
- Python--day14(迭代器)
今日主要内容 1. 带参装饰器 (了了解) 2. 迭代器(*****) 可迭代对象 迭代器对象 for迭代器 枚举对象 1. 带参装饰器 1. 通常,装饰器为被装饰的函数添加新功能,需要外界的 ...
- QinQ 简介
QinQ 是一种二层隧道协议,通过将用户的私网报文封装上外层 VLAN Tag,使其携带两层 VLAN Tag 穿越公网,从而为用户提供了一种比较简单的二层VPN隧道技术.QinQ 的实现方式可分为两 ...
- Kubernetes & Docker
Docker核心技术原理及其应用 Docker 概览 Docker版本与安装介绍 Docker 核心技术之镜像 Docker 核心技术之容器 Docker 核心技术之容器与镜像 Docker 核心技术 ...
- 用WPS查看两篇word文档异同之处
写的合同,后期又有修改,电脑里同样名字的合同有好几个版本,不知道有什么不同,怎么办? 打开wps-->[审阅]-->[比较],剩下的按照提示很容易,略...
- ubuntu linux 安装分区
挂载点/:主分区:安装系统和软件:大小为150G:分区格式为ext4: 挂载点/home:逻辑分区:相当于"我的文档":150G大小为硬盘剩下的; 分区格式ext4: swap:逻 ...
- Nmap小技巧——探测大网络空间中的存活主机
Nmap快速探测空间主机是否存活的技巧(来自lijiejie师傅): nmap -v -sn -PE -n --min-hostgroup --min-parallelism -oX nmap_out ...
- cinder-volume报错vmdk2 is reporting problems, not sending heartbeat. Service will appear "down".
cinder-volume报错vmdk2 is reporting problems, not sending heartbeat. Service will appear "down&qu ...
- 题解:LOJ540游戏
题目描述 小L计划进行n场游戏,每场游戏使用一张地图,小 L 会同时使用三辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 A.B.C 表示.地图是一张无向简单图(没有重边或自环),每次 ...
- 深入理解JVM(7)——线程安全和锁优化
Java中的线程安全 按照线程安全的“安全程度”由强至弱来排序,可以将Java语中各种操作共享的数据分为以下5类:不可变. 绝对线程安全. 相对线程安全. 线程兼容和线程对立. 1.不可变 不变的对象 ...
- DBCP 连接池
DBCP数据源 DBCP 是 Apache 软件基金组织下的开源连接池实现 导入maven包: <!-- dbcp连接池 --> <dependency> <groupI ...