| 序号 | 系列文章 |
|---|---|
| 1 | 【MySQL基础】MySQL介绍及安装 |
| 2 | 【MySQL基础】MySQL基本操作详解 |
| 3 | 【MySQL基础】MySQL基本数据类型 |
| 4 | 【MySQL基础】MySQL表的七大约束 |
文章目录
大家好,我是小杨!今天我将详细的为大家介绍MySQL中的字符集与校对集的相关知识,希望大家能够从中收获多多!
1,字符集的含义
字符指计算机中保存的各种文字和符号,包括各种国家的文字、标点符号、图形、符号、数字等。
由于计算机采用的是二进制保存数据,用户输入的字符将会按照一定的规则转化为二进制后保存,这个过程就是字符编码。
将一系列的字符的编码规则组合起来,就形成了字符集,用于表示特定的文本信息。
2,常见的字符集
在计算机的发展历史中,出现了许多的字符集,MySQL也提供了各种各样的字符集的支持。
常用的字符集有以下几种:
| 字符集 | 单字符最大长度 | 支持的语言 |
|---|---|---|
| latinl | 1字节 | 西欧字符,希腊字符等 |
| gbk | 2字节 | 简体和繁体中文,日文,韩文等 |
| utf8 | 3字节 | 世界上大部分国家的文字 |
| utf8mb4 | 4字节 | 支持几乎所有的语言 |
注意事项:
3,查看MySQL中的字符集
MySQL中提供了挺多的字符集的支持,查看MySQL中可用字符集基本语法如下:
SHOW CHARACTER SET;
操作结果如下:

操作结果分析:
Charset:字符集名称
Description:描述信息
Default collation:默认校对集
Maxlen:单字符的最大长度
1,校对集的含义
校对集是数据比较的规则,用于为不同的字符集指定比较和排序规则。
校对集依赖字符集,每个字符集有多种校对规则。
2,校对集名称的构成
latinl字符集对应的校对集为latinl_swedish_ci
- 校对集的名称由
_分隔的三部分组成的。- 开头的latinl表示对应的字符集。
- 中间的swedish表示国家名或者使用general。
- 结尾的是ci,cs或bin,ci表示不区分大小写,cs表示区分大小写,bin表示以二进制的方式比较。
3,校对集的查看
MySQL也提供了许多的字符集,查看MySQL中可用校对集基本语法如下:
SHOW COLLATION;
操作结果如下:

操作结果分析:
Collatioin:校对集名称
Charset:对应的字符集
Id:校对集ID
default:是否为对应字符集的默认校对集
Compiled:是否已编译
Sortlen:排序的内存需求量
MySQL 的字符集和校对规则有 4 个级别的默认设置,即服务器级、数据库级、表级和字段级。
它们分别在不同的地方设置,作用也不相同。
1,当前会话使用的字符集查看
SHOW VARIABLES LIKE 'CHARACTER%';
操作结果如下:

操作结果说明:
2,MySQL环境与字符集相关的变量
| 变量名 | 含义 |
|---|---|
| character_set_client | 客户端字符集 |
| character_set_connection | 客户端与服务器连接使用的字符集 |
| character_set_database | 默认数据库使用的字符集 |
| character_set_filesystem | 文件系统字符集 |
| character_set_results | 将查询结果()返回给客户端的字符集 |
| character_set_server | 服务器默认字符集 |
| character_set_system | 服务器用来存储标识符的字符集 |
| character_sets_dir | 安装字符集的目录 |
注意事项说明:
3,字符集变量的设置更改
set 变量名 = 值;
操作实例:
set character_set_client = gbk;
set character_set_connecction = gbk;
set character_set_results = gbk;
4,注意事项说明:
set names 字符集; 直接进行修改,即set names gbk;。set或set names修改字符集只对当前会话有效,不会对其它的会话产生影响,且会话结束后,下次的会话仍然使用默认值。数据库的字符集和校对集既可以在创建数据库时指定,也可以在创建完数据库后通过 ALTER DATABASE 命令进行修改。
1,创建数据库时设定字符集和校对集
#既未指定字符集,又未指定校对集
CREATE DATABASE 库名称;
#仅指定字符集,未指定校对集
CREATE DATABASE 库名称 CHARACTER SET [=] charset_name;
#仅指定校对集,未指定字符集
CREATE DATABASE 库名称 COLLATE [=] collation_name;
#既指定字符集,又指定校对集
CREATE DATABASE 库名称 CHARACTER SET [=] charset_name COLLATE [=] collation_name;
知识点:
CHARACTER SET用于指定字符集,COLLATE用于指定校对集。
字符集和校对集的设定规则:
若指定字符集,又指定校对集,表示数据库使用指定的字符集和校对集。
若仅指定字符集,未指定校对集,表示数据库使用该字符集的默认校对集。
若仅指定校对集,未指定字符集,表示数据库使用该校对集对应的字符集。
若未指定字符集,又未指定校对集,表示数据库使用服务器字符集和校对集作为数据库的字符集和校对规则。
为了避免受到默认值的影响,推荐在创建数据库时指定字符集和校对集。
操作实例:
创建数据库mydb_1,指定字符集为utf8,使用默认校对集utf8_genral_ci的示例语句:
create database mydb_1 character set utf8;

2,修改数据库的字符集和校对集
如果您在创建完数据库后想进行修改它的字符集或校对集,可以使用 ALTER DATABASE 语句。
#对数据库的字符集单独进行修改
ALTER DATABASE 库名称 CHARACTER SET [=] charset_name;
#对数据库的校对集单独进行修改
ALTER DATABASE 库名称 COLLATE [=] collation_name;
#对数据库的字符集和校对集进行修改
ALTER DATABASE 库名称 CHARACTER SET [=] charset_name COLLATE [=] collation_name;
操作实例:
将 mydb_1数据库的字符集修改为 latin1,校对规则修改为 latin1_general_ci 的示例语句:
ALTER DATABASE mydb_1 CHARACTER SET latin1 COLLATE latin1_general_ci;

需要注意的是,如果数据库里已经存在数据表,修改字符集后,已有的数据表不会按照新的字符集重新存放,所以不能通过修改数据库的字符集来修改数据表的内容。
3,查看数据库的字符集和校对集
#第一步:进入操作库
use 库名称;
#第二步:查看操作库的创建信息
SHOW CREATE DATABASE 库名称 \G;

数据表的字符集和校对集在创建表的时候指定,也可以在创建完表后通过 ALTER TABLE 命令进行修改。
1,创建数据表时设定字符集和校对集
#既未指定字符集,又未指定校对集
CREATE TABLE 表名称 (字段名 字段类型...);
#仅指定字符集,未指定校对集
CREATE TABLE 表名称 (字段名 字段类型...) CHARACTER SET [=] charset_name;
#仅指定校对集,未指定字符集
CREATE TABLE 表名称 (字段名 字段类型...) COLLATE [=] collation_name;
#既指定字符集,又指定校对集
CREATE TABLE 表名称 (字段名 字段类型...) CHARACTER SET [=] charset_name COLLATE [=] collation_name;
知识点:
CHARACTER SET可简写为CHARSET。
设置表的字符集及校对集和设置数据库字符集的规则基本类似:
若指定字符集,又指定校对集,表示数据表使用指定的字符集和校对集。
若仅指定字符集,未指定校对集,表示数据表使用该字符集的默认校对集。
若仅指定校对集,未指定字符集,表示数据表使用该校对集对应的字符集。
若未指定字符集,又未指定校对集,表示数据表使用数据库字符集和校对集作为数据表的字符集和校对规则。
为了避免受到默认值的影响,推荐在创建数据表时指定字符集和校对集。
操作实例:
在数据库mydb_1中创建数据表demo1,指定字符集为utf8,使用默认校对集utf8_genral_ci的示例语句:
create table demo1(
id int,
name varchar(15)
)character set utf8;

2,修改数据表的字符集和校对集
如果您在创建完数据库后想进行修改它的字符集或校对集,可以使用 ALTER tables 语句。
#对数据库的字符集单独进行修改
ALTER TABLE 表名称 CHARACTER SET [=] charset_name;
#对数据库的校对集单独进行修改
ALTER TABLE 表名称 COLLATE [=] collation_name;
#对数据库的字符集和校对集进行修改
ALTER TABLE 表名称 CHARACTER SET [=] charset_name COLLATE [=] collation_name;
操作实例:
将数据表demo1的字符集修改为 latin1,校对集修改为 latin1_general_ci 的示例语句:
alter table demo1 character set latin1 collate latin1_general_ci;

3,查看数据表的字符集和校对集
SHOW CREATE TABLE 表名称 \G;

字段的字符集和校对集在创建表的时候指定,也可以在创建完表后通过 ALTER TABLE 命令进行修改
1,创建字段时设定字符集和校对集
#既未指定字符集,又未指定校对集
CREATE TABLE 表名称 (字段名1 字段类型 ...);
#仅指定字符集,未指定校对集
CREATE TABLE 表名称 (字段名1 字段类型 CHARACTER SET [=] charset_name, ...);
#仅指定校对集,未指定字符集
CREATE TABLE 表名称 (字段名1 字段类型 COLLATE [=] collation_name, ...);
#既指定字符集,又指定校对集
CREATE TABLE 表名称 (字段名1 字段类型 CHARACTER SET [=] charset_name COLLATE [=] collation_name, ...);
操作实例:
在数据库mydb_1中创建数据表demo2,指定字段name的字符集为utf8,使用默认校对集utf8_genral_ci的示例语句:
create table demo2(
name varchar(15) character set utf8);

2,修改数据库的字符集和校对集
如果您在创建完数据库后想进行修改它的字符集或校对集,可以使用 ALTER DATABASE 语句,语法格式如下:
ALTER TABLE 表名称 MODIFY 字段名 数据类型 [CHARACTER SET charset_name][COLLATE collation_name];
操作实例:
将数据表demo2里的name字段的字符集修改为utf8,使用默认校对集utf8_genral_ci 的示例语句:
alter table demo2 modify name varchar(15) character set utf8;

注意:如果在创建字段的时候没有特别指定字符集和校对规则,默认使用数据表的字符集和校对规则。
3,查看数据表的字符集和校对集
SHOW CREATE TABLE 表名称 \G;
操作实例:

这就是本期博客的全部内容啦,想必大家已经对MySQL中的字符集和校对集的相关知识有了全新地认识和理解吧,如果有什么其他的问题无法自己解决,可以在评论区留言哦!
最后,如果你觉得这篇文章写的还不错的话或者有所收获的话,麻烦小伙伴们动动你们的小手,给个三连呗(点赞👍,评论✍,收藏📖),多多支持一下!各位的支持是我最大的动力,后期不断更新优质的内容来帮助大家,一起进步。那我们下期见!

总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg