关于MySQL的字符集

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 系统变量 字符集相关的系统变量 mysql> show variables like '%char%'; +--------------------------+--------------------------------...


系统变量

字符集相关的系统变量

mysql> show variables like '%char%';
+--------------------------+------------------------------------------------------------------------------+
| Variable_name            | Value                                                                        |
+--------------------------+------------------------------------------------------------------------------+
| character_set_client     | utf8                                                                         |
| character_set_connection | utf8                                                                         |
| character_set_database   | utf8                                                                         |
| character_set_filesystem | binary                                                                       |
| character_set_results    | utf8                                                                         |
| character_set_server     | utf8                                                                         |
| character_set_system     | utf8                                                                         |
| character_sets_dir       | /usr/local/Percona-Server-5.6.29-rel76.2-Linux.x86_64.ssl101/share/charsets/ |
+--------------------------+------------------------------------------------------------------------------+
8 rows in set (0.01 sec) 

各个变量的含义概述如下:

  • character_set_client :客户端发给服务端的SQL的字符集
  • character_set_connection : 字符常量的缺省字符集
  • character_set_database:缺省数据库(即use指定的数据库)的缺省字符集
  • character_set_filesystem:文件系统字符集,用于解释文件名字符常量
  • character_set_results:结果集和错误消息的字符集
  • character_set_server: 服务器的缺省字符集
  • character_set_system: 系统标识符的字符集
  • character_sets_dir: 字符集安装目录

详细定义参考官网说明:

排序规则相关的系统变量:

mysql> show variables like '%collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec) 

排序规则和上面的字符集是对应的,就不解释了。但有一个问题,UTF8编码下该设置utf8_general_ci 还是utf8_unicode_ci有一些讨论。 比如:What's the difference between utf8_general_ci and utf8_unicode_ci

utf8_general_ci排序略快一些,utf8_unicode_ci对某些语义排序更准确。然而,所谓的"更快",快的程度可以无视;"更准确"所适用的场景对使用中文的我们没啥意义。所以个人认为设啥都没关系,干脆顺气自然不设,让MySQL自己根据字符集选择缺省值吧(即utf8_general_ci)。

数据存储

字符数据的最终存储到表的字符类型的列上,所以存储的最终体现形式是列的字符集。至于表的字符集不过是生成列时的缺省字符集;数据库的字符集不过建表时的缺省字符集。

一劳永逸的字符设置

谈到字符主要让人操心的是乱码问题,最简单有效的解决办法是统一设置UTF8编码。 只要在my.cnf的[mysqld]上设置character_set_server即可。

character_set_server           = utf8mb4 

这样,新创建的数据库和该数据库中的对象将默认采用'utf8mb4'编码;

JDBC(5.1.13以后版本)客户端将根据服务端的character_set_server设置合适的客户端编码;

http://dev.mysql.com/doc/relnotes/connector-j/5.1/en/news-5-1-14.html

Connector/J mapped both 3-byte and 4-byte UTF8 encodings to the same Java UTF8 encoding.

To use 3-byte UTF8 with Connector/J set characterEncoding=utf8 and set useUnicode=true in the connection string.

To use 4-byte UTF8 with Connector/J configure the MySQL server with character_set_server=utf8mb4. Connector/J will then use that setting as long as characterEncoding has not been set in the connection string. This is equivalent to autodetection of the character set. (Bug #58232) 

排序规则无需专门设置,让它跟随编码自己变化。

参考



相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
50
分享
相关文章
【MySQL系列】SQL语句入门(创建删除操作)、字符集和数据类型详解
哈喽,大家好💓,在上一篇博客中,大致讲解了数据库的相关知识,它的作用、定义、分类等等。从本篇博客开始,将详细讲解关系型数据库MySQL的操作与使用,以及SQL语句的讲解。
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
475 81
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
MySQL 8.0 字符集与比较规则介绍
我们都知道 MySQL 8.0 与 MySQL 5.7 的区别之一就是默认字符集从 latin1 改成了 utf8mb4 ,除此之外,MySQL 8.0 下的字符集和比较规则还有没有其他变化呢?本篇文章我们一起来学习下。
476 1
MySQL各字符集、排序规则的由来、用法,区别和联系
MySQL支持多种字符集和排序规则,这些在数据库设计和数据处理中起着重要作用。下面是它们的由来、用法、区别和联系: 1. **字符集(Character Set)**: - **由来**:字符集定义了数据库中可以存储的字符集合,以及这些字符在数据库中的存储方式。 - **用法**:在创建数据库或表时,可以指定所需的字符集。常见的字符集包括UTF-8、UTF-16、Latin1等。 - **区别和联系**:不同的字符集支持不同的字符范围和存储方式,选择合适的字符集可以确保数据的正确存储和处理。例如,UTF-8支持全球范围内的大多数字符,而Latin1只支持西欧语言字符集。
189 1
详解MySQL字符集和Collation
详解MySQL字符集和Collation
828 2
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等