mysql 字符集(CHARACTER SET)和…

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 字符集(CHARACTER SET)和校对集(COLLATE)

字符集:


可以设置 服务器默认字符集


数据库默认字符集


表默认字符集


甚至到列默认字符集


某个级别没有指定,那么继承上级。


mysql4.1及其之后的版本,对字符集的支持分为四个层次:


服务器(server),数据库(database),数据表(table)和连接(connection):

character_set_server:这是设置服务器使用的字符集

character_set_client :这是设置客户端发送查询使用的字符集

character_set_connection :这是设置服务器需要将收到的查询串转换成的字符集

character_set_results :这是设置服务器要将结果数据转换到的字符集,转换后才发送给客户端

整个过程:

- client(如php程序)发送一个查询;

- 服务器收到查询,将查询串从character_set_client 转换到character_set_connection,然后执行转换后的查询;

- 服务器将结果数据转换到character_set_results字符集后发送回客户端。


1 、告诉服务器发送的数据是什么类型的。


character_set_client


2、告诉转换器,转换什么编码


character_set_connection


3、查询结果用什么编码




character_set_results


如果三者都是字符集N


那么 可以简写为 set names N;



例如:


客户端字符集和连接字符集

如果connection服务器的字符集,比client小时,容易丢失数据。

 

create table时的charset服务器的字符编码


校对集:

可以理解为,排序规则等。一个字符集可能有多种校对集合;

------ 官方文档---------


1、数据库字符集和校对


CREATE DATABASE db_name


   [[DEFAULT] CHARACTER SET charset_name]


   [[DEFAULT] COLLATE collation_name]


例如:


CREATE DATABASE db_name

   DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;

MySQL这样选择数据库字符集和数据库校对规则:


·         如果指定了CHARACTER SET X和COLLATE Y,那么采用字符集X和校对规则Y。


·         如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。


·         否则,采用服务器字符集和服务器校对规则。


2、表字符集和校对

每一个表有一个表字符集和一个校对规则,它不能为空。为指定表字符集和校对规则,CREATE TABLE 和ALTER TABLE语句有一个可选的子句:


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]


MySQL按照下面的方式选择表字符集和 校对规则:


·         如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。


·         如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。


·         否则,采用服务器字符集和服务器校对规则。


如果在列定义中没有指定列字符集和校对规则,则默认使用表字符集和校对规则。表字符集和校对规则是MySQL的扩展;在标准SQL中没有。


3、列字符集和校对

每一个“字符”列(即,CHAR、VARCHAR或TEXT类型的列)有一个列字符集和一个列 校对规则,它不能为空。列定义语法有一个可选子句来指定列字符集和校对规则:


col_name {CHAR | VARCHAR | TEXT} (col_length)


   [CHARACTER SET charset_name [COLLATE collation_name]]


例如:


CREATE TABLE Table1


(


   column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci


);


MySQL按照下面的方式选择列字符集和校对规则:


·         如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。


·         如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。


·         否则,采用表字符集和服务器校对规则。


CHARACTER SET和COLLATE子句是标准的SQL。


示例1:表和列定义


CREATE TABLE t1

(

   c1 CHAR(10) CHARACTER SET latin1 COLLATE latin1_german1_ci

) DEFAULT CHARACTER SET latin2 COLLATE latin2_bin;

在这里我们有一个列使用latin1字符集和latin1_german1_ci校对规则。是显式的定义,因此简单明了。需要注意的是,在一个latin2表中存储一个latin1列不会存在问题。


示例2:表和列定义


CREATE TABLE t1

(

   c1 CHAR(10) CHARACTER SET latin1

) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;

这次我们有一个列使用latin1字符集和一个默认校对规则。尽管它显得自然,默认校对规则却不是表级。相反,因为latin1的默认校对规则总是latin1_swedish_ci,列c1有一个校对规则latin1_swedish_ci(而不是latin1_danish_ci)。


示例3:表和列定义


CREATE TABLE t1

(

   c1 CHAR(10)

) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;

我们有一个列使用一个默认字符集和一个默认校对规则。在这种情况下,MySQL查找表级别来确定列字符集和 校对规则。因此,列c1的字符集是latin1,它的 校对规则是latin1_danish_ci。


示例4:数据库、表和列定义


CREATE DATABASE d1

   DEFAULT CHARACTER SET latin2 COLLATE latin2_czech_ci;

USE d1;

CREATE TABLE t1

(

   c1 CHAR(10)

);

我们创建了一个没有指定字符集和校对规则的列。我们也没有指定表级字符集和校对规则。在这种情况下,MySQL查找数据库级的相关设置。(数据库的设置变为表的设置,其后变为列的设置。)因此,列c1的字符集为是latin2,它的 校对规则是latin2_czech_ci。


在SQL语句中使用COLLATE

使用COLLATE子句,能够为一个比较覆盖任何默认校对规则。COLLATE可以用于多种SQL语句中。下面是一些例子:

·         使用ORDER BY:


·                SELECT k


·                FROM t1


·                ORDER BY k COLLATE latin1_german2_ci;


·         使用AS:


·                SELECT k COLLATE latin1_german2_ci AS k1


·                FROM t1


·                ORDER BY k1;


·         使用GROUP BY:


·                SELECT k


·                FROM t1


·                GROUP BY k COLLATE latin1_german2_ci;


·         使用聚合函数:


·                SELECT MAX(k COLLATE latin1_german2_ci)


·                FROM t1;


·         使用DISTINCT:


·                SELECT DISTINCT k COLLATE latin1_german2_ci


·                FROM t1;


·         使用WHERE:


·                     SELECT *


·                     FROM t1


·                     WHERE _latin1 'Müller' COLLATE latin1_german2_ci = k;


·                     SELECT *


·                     FROM t1


·                     WHERE k LIKE _latin1 'Müller' COLLATE latin1_german2_ci;


·         使用HAVING:


·                SELECT k


·                FROM t1


·                GROUP BY k


·                HAVING k = _latin1 'Müller' COLLATE latin1_german2_ci;


COLLATE子句优先


COLLATE子句有较高的优先级(高于||),因此下面两个表达式是等价的:


x || y COLLATE z


x || (y COLLATE z)


 

————————————————

版权声明:本文为CSDN博主「明明如月学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/w605283073/article/details/46572539


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10月前
|
关系型数据库 MySQL 存储
【MySQL】——数据类型及字符集
【MySQL】——数据类型及字符集
【MySQL】——数据类型及字符集
|
2月前
|
存储 人工智能 搜索推荐
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
577 81
|
10月前
|
存储 人工智能 搜索推荐
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
|
4月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
447 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
10月前
|
存储 SQL 关系型数据库
MySQL 中character_set_server 和collation_server
在MySQL中,`character_set_server` 和 `collation_server` 是两个重要的系统变量,它们分别用于定义服务器级别的字符集和排序规则。 1. **character_set_server**: * 这个变量定义了MySQL服务器使用的默认字符集。字符集是一组字符的编码方式,它决定了如何在数据库中存储和检索字符数据。 * 例如,`utf8` 是一个常用的字符集,它支持大部分Unicode字符,包括中文、英文、阿拉伯文等。 * 你可以通过以下SQL命令查看当前的 `character_set_server` 设置: ``` sql`SHOW V
1682 1
|
5月前
|
存储 关系型数据库 MySQL
MySQL中利用FIND_IN_SET进行包含查询的技巧
`FIND_IN_SET`提供了一种简便的方法来执行包含查询,尤其是当数据以逗号分隔的字符串形式存储时。虽然这个方法的性能可能不如使用专门的关系表,但在某些场景下,它提供了快速简便的解决方案。开发者应该根据具体的应用场景和性能要求,权衡其使用。
218 0
|
6月前
|
Windows
网页制作- Code Page,Character Set,语种对应列表
网页制作- Code Page,Character Set,语种对应列表
|
8月前
|
存储 JSON 关系型数据库
mysql中find_in_set()函数用法详解及增强函数
总结而言,`FIND_IN_SET()`是MySQL中处理由逗号分隔的字符串列表的一种便捷方法,尤其适用于列表相对较短且不经常更改的场景。然而,对于更为复杂的需要高性能和可扩展性的数据库设计,它可能不是最优选择,应考虑使用更加正规化的数据库结构。
1031 2
mysql中find_in_set()函数用法详解及增强函数
|
8月前
|
存储 人工智能 关系型数据库
MySQL 8.0 字符集与比较规则介绍
我们都知道 MySQL 8.0 与 MySQL 5.7 的区别之一就是默认字符集从 latin1 改成了 utf8mb4 ,除此之外,MySQL 8.0 下的字符集和比较规则还有没有其他变化呢?本篇文章我们一起来学习下。
505 1
|
9月前
|
存储 自然语言处理 关系型数据库