MySQL 字符集问题

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介:

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
关系型数据库 MySQL 存储
【MySQL】——数据类型及字符集
【MySQL】——数据类型及字符集
【MySQL】——数据类型及字符集
|
SQL 存储 关系型数据库
【MySQL系列】SQL语句入门(创建删除操作)、字符集和数据类型详解
哈喽,大家好💓,在上一篇博客中,大致讲解了数据库的相关知识,它的作用、定义、分类等等。从本篇博客开始,将详细讲解关系型数据库MySQL的操作与使用,以及SQL语句的讲解。
|
存储 人工智能 搜索推荐
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
|
7月前
|
关系型数据库 MySQL Linux
CentOS 7系统下详细安装MySQL 5.7的步骤:包括密码配置、字符集配置、远程连接配置
以上就是在CentOS 7系统下安装MySQL 5.7的详细步骤。希望这个指南能帮助你顺利完成安装。
1717 26
|
10月前
|
存储 人工智能 搜索推荐
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
2528 82
|
8月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
本文探讨了在使用YMP 23.2.1.3迁移MySQL Server字符集为latin1的中文数据至YashanDB时出现乱码的问题。问题根源在于MySQL latin1字符集存放的是实际utf8编码的数据,而YMP尚未支持此类场景。文章提供了两种解决方法:一是通过DBeaver直接迁移表数据;二是将MySQL表数据转换为Insert语句后手动插入YashanDB。同时指出,这两种方法适合单张表迁移,多表迁移可能存在兼容性问题,建议对问题表单独处理。
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
|
存储 关系型数据库 MySQL
3.3 【MySQL】字符集和比较规则的应用
3.3 【MySQL】字符集和比较规则的应用
144 0
|
存储 人工智能 关系型数据库
MySQL 8.0 字符集与比较规则介绍
我们都知道 MySQL 8.0 与 MySQL 5.7 的区别之一就是默认字符集从 latin1 改成了 utf8mb4 ,除此之外,MySQL 8.0 下的字符集和比较规则还有没有其他变化呢?本篇文章我们一起来学习下。
831 1
|
存储 自然语言处理 关系型数据库
|
存储 关系型数据库 MySQL
MySQL各字符集、排序规则的由来、用法,区别和联系
MySQL支持多种字符集和排序规则,这些在数据库设计和数据处理中起着重要作用。下面是它们的由来、用法、区别和联系: 1. **字符集(Character Set)**: - **由来**:字符集定义了数据库中可以存储的字符集合,以及这些字符在数据库中的存储方式。 - **用法**:在创建数据库或表时,可以指定所需的字符集。常见的字符集包括UTF-8、UTF-16、Latin1等。 - **区别和联系**:不同的字符集支持不同的字符范围和存储方式,选择合适的字符集可以确保数据的正确存储和处理。例如,UTF-8支持全球范围内的大多数字符,而Latin1只支持西欧语言字符集。
361 1

推荐镜像

更多