MySQL 字符集问题

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

MySQL的字符集问题可以归纳为继承问题

可以查看字符集参数例如

mysql> show variables like 'character%';

+--------------------------+----------------------------+

| Variable_name            | Value                      |

+--------------------------+----------------------------+

| character_set_client     | latin1                   客户端字符集

| character_set_connection | latin1                   客户与服务连接采用的字符集

| character_set_database   | utf8                     数据库采用的字符集

| character_set_filesystem | binary                     |

| character_set_results    | latin1                   SELECT查询返回数据的字符集

| character_set_server     | utf8                       |

| character_set_system     | utf8                       |

| character_sets_dir       | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

8 rows in set (0.00 sec)


字符集的设置可以卸载mysqld端也可以在client端

可以在my.cnf中设置:

[mysqld]

default-character-set=gbk

或者在启动选项中指定:

mysqld --default-character-set=gbk

或者在编译的时候指定:

./configure --with-charset=gbk

 

可查看原理部分,如果我用程序插入字符集为utf8的字符,要在mysql客户端正常显示,则需要把character_set_results设置为utf8格式

原理解析:

MySQL存储数据的唯一地方就是列,所以继承的较高层次只有默认值。表的默认字符集不会影响到表里面存储的数据,它只是告诉MySQL在创建列的时候如果没有指定字符集,那么就使用该默认值

在显式地定义字符集的时候,并不需要同时定义字符集和排序规则。

只有基于字符的值才有字符集

其他的任何东西都只是规定使用何种字符集来进行比较或其他操作

基于字符的值可以是存储在列中的值、查询中使用的字面常量、表达式的结果、用户变量等。

 

MySQL的设置分为下面两类:

  1. 创建对象时的默认设置

当创建一个数据库的时候,它从服务器继承了character_set_server

当创建表的时候,它从数据库继承字符集

当创建列的时候,它从表继承字符集

 

  1. 用于客户端/服务器沟通的设置

    1. 服务器假设客户端正在按照character_set_client设置的字符集发送数据

    2. 服务器从客户端收到语句后,它按照character_set_connection设置的字符集对数据进行翻译,它也会用这个字符集决定如何把数字转换为字符串。

    3. 当服务器把结果或错误信息返回客户端时,它会按照character_set_result定义的字符集进行翻译。

 

使用set names命令,set names实际上就是同时设置了 character_set_client character_set_connection character_set_results

或者set character set命令按照自己的需要改变上面的3个设置。

但是,这两个命令只会影响服务器的设置。客户端程序和API也需要正确地进行设置,以避免和服务器的沟通问题

 

 

注意:

character_set_database的默认值是默认数据库的值。当改变默认数据库的时候,它也会跟着改变。如果没有默认数据库,它的默认值就是character_set_server

LOAD DATA INFILE按照当前character_set_database的设置解释接收到的数据。



本文转自 aklaus 51CTO博客,原文链接:http://blog.51cto.com/aklaus/1609363

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL 存储
【MySQL】——数据类型及字符集
【MySQL】——数据类型及字符集
165 0
【MySQL】——数据类型及字符集
|
6月前
|
SQL 存储 关系型数据库
【MySQL系列】SQL语句入门(创建删除操作)、字符集和数据类型详解
哈喽,大家好💓,在上一篇博客中,大致讲解了数据库的相关知识,它的作用、定义、分类等等。从本篇博客开始,将详细讲解关系型数据库MySQL的操作与使用,以及SQL语句的讲解。
|
8月前
|
关系型数据库 MySQL 数据库
Mysql 创建数据库字符集与排序规则
Mysql 创建数据库字符集与排序规则
181 0
|
1月前
|
存储 人工智能 搜索推荐
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
|
1月前
|
存储 人工智能 关系型数据库
详细介绍TiDB 与 MySQL 中的常用字符集及排序规则
一文理清 TiDB 与 MySQL 中的常用字符集及排序规则
115 6
|
2月前
|
存储 关系型数据库 MySQL
【2024】新建mysql数据库,如何选择字符集和排序规则
【2024】新建mysql数据库,如何选择字符集和排序规则
147 1
|
7月前
|
存储 关系型数据库 MySQL
3.3 【MySQL】字符集和比较规则的应用
3.3 【MySQL】字符集和比较规则的应用
43 0
|
2月前
|
存储 关系型数据库 MySQL
从零开始学Mysql - 字符集和编码(下)
从零开始学Mysql - 字符集和编码(下)
108 0
|
2月前
|
存储 SQL 关系型数据库
从零开始学Mysql - 字符集和编码(上)
从零开始学Mysql - 字符集和编码(上)
137 0
|
4月前
|
关系型数据库 MySQL 数据库
Mysql 创建数据库字符集与排序规则
Mysql 创建数据库字符集与排序规则
151 2