MySQL-客户端连接时的编码问题
文章目录
- 查看字符编码
- 服务器字符集和排序
- 数据库字符集和排序规则
- 表的字符集和排序规则
- 列的字符集和排序规则
- 字符串常量的字符集和排序规则
- set names 命令
- 客户端交互和字符集设置
查看字符编码
-- 查看当前支持哪些字符集
show character set;
服务器据集: character_set_server, collation_server
数据库默认数据集:character_set_database, collation_database
系统元数据数据集:character_set_system, collation_system
连接数据集:character_set_connection, collation_connection
结果数据集:character_set_results, collation_results
服务器字符集和排序
服务器字符集和排序规则,可以在服务启动的时候通过命令行参数或选项文件设置,也可以在运行时修改。
不指定字符集,则默认使用 utf8mb4,不指定排序规则,则根据当前字符集确定默认的排序规则。、
如下三条命是等价的:
mysqld
# 默认字符集是 utf8mb4
mysqld --character-set-server=utf8mb4
# utf8mb4 的默认排序规则是 utf8mb4_0900_ai_ci
mysqld --character-set-server=utf8mb4 \--collation-server=utf8mb4_0900_ai_ci
可以在编译时修改默认字符集。
服务器的默认字符集设置,有且仅有唯一一个用途:crate database 创建数据库的时候,如果没有指定数据库的默认字符集,则使用服务器
设置的字符集和排序规则。
查看服务器字符集设置,使用系统变量 character_ser_server, 和 collaction_server.
数据库字符集和排序规则
每个数据库都有默认的字符集合排序规则设置。create database 和 alter database 语句都有可选地字符集设置子句,这个子句允许数据库使用不同于当前服务器字符集的字符集。
CREATE DATABASE db_name[[DEFAULT] CHARACTER SET charset_name][[DEFAULT] COLLATE collation_name]ALTER DATABASE db_name[[DEFAULT] CHARACTER SET charset_name][[DEFAULT] COLLATE collation_name]
数据库的各种选项存放在数据字典中,这个表 INFORMATION_SCHEMA.SCHEMATA 。
每个连接都有个默认数据库的概念,系统变量 character_set_database和 collation_database 对应当前数据库的默认值字符集和排序。
每当更改当前数据库时,这两个变量会自动更改,如果没有设置当前数据库,则这两个变量分别取服务器字符集和排序规则的值。
use test_db;
select @@character_set_database, @@collation_database;select default_character_set_name, default_collation_name
from information_schema.schemata
where schema_name = 'mysql';
数据库字符集的用途:
- create table 语句中,如果没有显式指定字符集,则使用数据库字符集设置。
- load data 语句,如果没有指定字符集(character set 子句),则使用系统变量 haracter_set_database 的字符集解读数据文件。
- 对于存储例程(过程和函数),例程创建时,其形参声明,如果是字符数据类型,则除非显式指定字符集,否则使用数据库的默认字符集设置。
表的字符集和排序规则
每个表有默认的字符集和排序规则。可以在建表的时候指定字符集,如果不指定,则使用数据库默认字符集。
注:表字符集设置是mysql的扩展,标准sql没有此选项。
CREATE TABLE tbl_name (column_list)[[DEFAULT] CHARACTER SET charset_name][COLLATE collation_name]]ALTER TABLE tbl_name[[DEFAULT] CHARACTER SET charset_name][COLLATE collation_name]
表的字符设置有如下用途:如果列没有指定字符集,则用表的字符集设置。
列的字符集和排序规则
每个字符列( CHAR, VARCHAR, 和 TEXT 这三个类型)都有一个字符集和排序设置。
列定义可以指定字符集
col_name {CHAR | VARCHAR | TEXT} (col_length)[CHARACTER SET charset_name][COLLATE collation_name]
Enum和Set也可以指定字符集
col_name {ENUM | SET} (val_list)[CHARACTER SET charset_name][COLLATE collation_name]
注:为列指定字符集则是标准sql语法。
如果使用alter table 修改列的字符集,则mysql会尝试进行数据转换,如果字符集不兼容,则可能有丢失数据。
查看列的字符集设置。
select table_name, column_name, data_type, character_set_name, collation_name
from information_schema.columns
where data_type in('char', 'varchar', 'enum', 'text')
limit 10;
字符串常量的字符集和排序规则
每个字符常量都一个字符集和排序规则。
简单语句,如select 'hello'
, 其中的字符串常量,其字符集和排序规则是当前连接的默认字符集(系统变量 character_set_connection,
collation_connection)。
可以显式指定字符串常量的字符集(引导符)和排序规则(collate子句)。注:这是标准sql规定的。
The _charset_name expression is formally called an introducer. It tells the parser, “the string that follows uses character set charset_name.”
-- [_charset_name]'string' [COLLATE collation_name]select 'abc';
select _latin1'abc';
select _binary'abc';
select _utf8mbr'ab' collate utf8mb4_danish_ci;
引导符不改变字符串的值(并不执行字符集转换)(尽管有可能会填充空白),它仅仅是一个信号。
set names 命令
set names 设置三个系统变量 character_set_client
, character_set_connection
, character_set_results
客户端交互和字符集设置
输入一条sql语句,按下回车,客户端发送出去的是字节流,服务端收到后按照 character_set_client
字符集解析为一个个的字符序列,对此序列执行语法解析,执行、并把结果用 character_set_results
指定的字符集编码为二进制串返回给客户端。
还有十六进制字面值、二进制字面值的存在,例如,把X’e4b8ad’存入表格中时,应当以什么字符集解读这个二进制串呢?
答案是:有字符集引导符就按字符集引导符处理,没有字符集引导符的就使用character_set_connection
作为缺省选择。如下:
create table t(name varchar(20) character set utf8mb4);select @@character_set_connection;
+----------------------------+
| @@character_set_connection |
+----------------------------+
| utf8mb4 |
+----------------------------+
1 row in set (0.00 sec)insert into t(name) values(X'e4b8ad'),(_gbk x'd6d0'),(_utf16le x'2d4e');
select name from t;
+------+
| name |
+------+
| 中 |
| 中 |
| 中 |
+------+
3 rows in set (0.00 sec)
附:汉字“中”的各种字符集下的编码
中
unicode 代码点 ['0x4e2d']
utf-8 : e4 b8 ad
gbk : d6 d0
utf-16-le : 2d 4e
utf-16-be : 4e 2d
UTF-32-LE : 2d 4e 00 00
UTF-32-BE : 00 00 4e 2d
sjis : 92 86
注:MySQL中地字符集
其实是指字符编码
。
MySQL-客户端连接时的编码问题相关推荐
- MySQL客户端连接网络不稳定解决办法
博文背景 作者是中国移动的校园网,网络连接不是很稳定,连接远程MySQL服务器会经常性出现断连现象,所以导致每次只要在客户端等几分钟不操作后再去执行操作时会导致需要新的新的连接建立需要十几秒中,大大降 ...
- MySQL创建数据库时指定编码和用户授权
为什么80%的码农都做不了架构师?>>> MySQL创建数据库时指定编码和用户授权 转载于:https://my.oschina.net/michao/blog/2989144
- php指定编码创建,MYSQL创建数据库时指定编码
mysql 创建 数据库时指定编码很重要,很多开发者都使用了默认编码,但是我使用的经验来看,制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题. 我们遵循的标准是,数据库,表,字段和页面或文本的 ...
- mysql客户端启动失败_MySQL Study案例之--MySQL客户端连接故障
MySQL Study案例之--MySQL客户端连接故障 系统环境: 操作系统:RedHat EL6 DB Soft: MySQL 5.6.4-m7 在系统安装了源码包 MySQL 5.6.4-m7 ...
- netty获取玩家chanel_基于netty的TCP服务端如何给客户端发送消息,但是如何拿到客户端连接时的SocketChannel呢,菜鸟求助?...
1.思路1 每个客户端连接时的SocketChannel保存在会话类sessionManager中的sessionIdMap中 问题: 1.客户端连接时确实将SocketChannel保存在会话类se ...
- linux mysql 客户端连接,linux系统中启动mysql方式已经客户端如和连接mysql服务器
零点间的记录 一.启动方式 1.使用linux命令service 启动: service mysqld start 2.使用 mysqld 脚本启动: /etc/inint.d/mysqld star ...
- mysql 客户端连接日志_MySQL 日志详解
一.MySQL 日志分类 MySQL 日志主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志. 错误日志: -log-err (记录启动.运行.停止 MySQL 服务时出现的信息) 查询日 ...
- Redis客户端连接时崩溃
文章目录 1. Redis客户端连接崩溃 1. Redis客户端连接崩溃 把 protected-model 设置为no
- MySQL客户端连接被频繁杀掉,企业案例(一):由于mysql sleep线程过多小故障
1.什么是长连接 长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态. 通常的短连接操作步骤是: 连接->数据传输->关闭连接: 而长连接通常就是: 连接-> ...
最新文章
- 扩增子项目动辄几百上千样品,如何写好实验设计——样品和组命名规则
- 如何在linux下检测内存泄漏
- 【Android Gradle 插件】Gradle 映射文件 ( settings.gradle 映射为 Settings 类 | build.gradle 映射为 Project 类 )
- mongodb内存映射原理
- GE 携手哈电国际开启国际合作新篇章
- 设置go path_Go命令的PATH安全性
- 链接ftp,把文件或图片上传到ftp指定的文件夹中
- 吴裕雄 02-mysql PHP语法
- Unity3D基础4:空物体与预制体
- java抛出异常齁_解決 Elasticsearch 使用 Java High Level REST Client 時出現 NoClassDefFoundError 錯誤...
- X86逆向教程12:内存补丁的制作
- 【系统分析师之路】2018年上系统分析师下午论文真题
- 公司人事管理系统(C++)
- ognl # % 的作用(井号,星号,百分号)
- 摄影曝光口诀_摄影中的“向右曝光”是什么以及为什么要这么做
- Ruby电子书教程、经典脚本合集
- 自然语言推理-文本蕴含识别简介
- 什么是Apache Isis
- SOHO设计师的多年工作经验总结
- Android OnDeviceAppPrediction 优化