【MySQL】 字符集

Metadata

title: 【MySQL】 字符集
date: 2022-12-20 16:12
tags:
  - 行动阶段/完成
  - 主题场景/数据存储
  - 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
  - 细化主题/数据存储/MySQL
categories:
  - 数据存储
keywords:
  - 数据存储
description: 【MySQL】 字符集

概述

  • MySQL有四个级别的字符集和比较规则:服务器级别数据库级别表级别列级别
  • 服务器级别包括character_set_server(字符集)和collation_server(比较规则)。
  • 数据库级别包括character_set_database(当前数据库字符集)和collation_database(当前数据库比较规则)。
  • 在创建或修改数据库时,可以指定字符集和比较规则,使用CREATE DATABASE和ALTER DATABASE语句。
  • 表级别包括在创建或修改表时指定字符集和比较规则,使用CREATE TABLE和ALTER TABLE语句。
  • 列级别包括在创建或修改列时指定字符集和比较规则,使用CREATE TABLE和ALTER TABLE语句。
  • 在请求发送到服务器并接收结果的过程中,涉及字符集转换:
    • 客户端使用操作系统的字符集编码请求字符串,并将其作为字节串发送给服务器。
    • 服务器使用character_set_client字符集解码接收到的字节串,并按照character_set_connection字符集编码。
    • 如果character_set_connection字符集与操作的列使用的字符集相同,则直接进行操作;否则,需要将请求中的字符串从character_set_connection字符集转换为列使用的字符集后再进行操作。
    • 从列获取的字节串将根据character_set_results字符集转换,并发送给客户端。
    • 客户端使用操作系统的字符集解析接收到的结果集字节串。

MySQL 的四个级别的字符集和比较规则

服务器级别

character_set_server 表示服务器级别的字符集, collation_server 表示服务器级别的比较规则。

数据库级别

character_set_database 表示当前数据库的字符集, collation_database 表示当前数据库的比较规则。

创建指定字符集和比较规则

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

修改指定字符集和比较规则

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

表级别

创建指定表字符集和比较规则

CREATE TABLE 【表名】
[[DEFAULT] CHARACTER SET 【字符集名称】]
[[DEFAULT] COLLATIE 【比较规则名称】];

修改指定表字符集和比较规则

ALTER TABLE 【表名】
[[DEFAULT] CHARACTER SET 【字符集名称】]
[[DEFAULT] COLLATIE 【比较规则名称】];

列级别

创建指定列字符集和比较规则

CREATE TABLE 【表名】 (
【列名】【字符串类型】 [ CHARACTER SET 【字符集名称】] [ COLLATIE 【比较规则名称】],
...
)

修改指定列字符集和比较规则

ALTER TABLE 【表名】 MODIFY【列名】【字符串类型】 
[ CHARACTER SET 【字符集名称】] [ COLLATIE 【比较规则名称】];

从发送请求到接收结果过程中发生的字符集转换

  1. 客户端使用操作系统的字符集编码请求字符串,向服务器发送的是经过编码的一个字节串。
  2. 服务器将客户端发送来的字节串采用character_set_client 代表的字符集进行解码,将解码后的字符串再按照character_set_connection 代表的字符集进行编码。
  3. 如果character_set_connection 代表的字符集和具体操作的列使用的字符集一致,则直接进行相应操作,否则的话需要将请求中的字符串从character_set_connection 代表的字符集转换为具体操作的列使用的字符集之后再进行操作。
  4. 将从某个列获取到的字节串从该列使用的字符集转换为character_set_results 代表的字符集后发送到客户端。
  5. 客户端使用操作系统的字符集解析收到的结果集字节串。