-
Notifications
You must be signed in to change notification settings - Fork 683
/
Copy pathMySQL 地基基础:数据库字符集.md.html
742 lines (645 loc) · 37.5 KB
/
MySQL 地基基础:数据库字符集.md.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
<!DOCTYPE html>
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<link rel="icon" href="/static/favicon.png">
<title>MySQL 地基基础:数据库字符集.md.html</title>
<!-- Spectre.css framework -->
<link rel="stylesheet" href="/static/index.css">
<!-- theme css & js -->
<meta name="generator" content="Hexo 4.2.0">
</head>
<body>
<div class="book-container">
<div class="book-sidebar">
<div class="book-brand">
<a href="/">
<img src="/static/favicon.png">
<span>技术文章摘抄</span>
</a>
</div>
<div class="book-menu uncollapsible">
<ul class="uncollapsible">
<li><a href="/" class="current-tab">首页</a></li>
</ul>
<ul class="uncollapsible">
<li><a href="../">上一级</a></li>
</ul>
<ul class="uncollapsible">
<li>
<a href="/文章/AQS 万字图文全面解析.md.html">AQS 万字图文全面解析.md.html</a>
</li>
<li>
<a href="/文章/Docker 镜像构建原理及源码分析.md.html">Docker 镜像构建原理及源码分析.md.html</a>
</li>
<li>
<a href="/文章/ElasticSearch 小白从入门到精通.md.html">ElasticSearch 小白从入门到精通.md.html</a>
</li>
<li>
<a href="/文章/JVM CPU Profiler技术原理及源码深度解析.md.html">JVM CPU Profiler技术原理及源码深度解析.md.html</a>
</li>
<li>
<a href="/文章/JVM 垃圾收集器.md.html">JVM 垃圾收集器.md.html</a>
</li>
<li>
<a href="/文章/JVM 面试的 30 个知识点.md.html">JVM 面试的 30 个知识点.md.html</a>
</li>
<li>
<a href="/文章/Java IO 体系、线程模型大总结.md.html">Java IO 体系、线程模型大总结.md.html</a>
</li>
<li>
<a href="/文章/Java NIO浅析.md.html">Java NIO浅析.md.html</a>
</li>
<li>
<a href="/文章/Java 面试题集锦(网络篇).md.html">Java 面试题集锦(网络篇).md.html</a>
</li>
<li>
<a href="/文章/Java-直接内存 DirectMemory 详解.md.html">Java-直接内存 DirectMemory 详解.md.html</a>
</li>
<li>
<a href="/文章/Java中9种常见的CMS GC问题分析与解决(上).md.html">Java中9种常见的CMS GC问题分析与解决(上).md.html</a>
</li>
<li>
<a href="/文章/Java中9种常见的CMS GC问题分析与解决(下).md.html">Java中9种常见的CMS GC问题分析与解决(下).md.html</a>
</li>
<li>
<a href="/文章/Java中的SPI.md.html">Java中的SPI.md.html</a>
</li>
<li>
<a href="/文章/Java中的ThreadLocal.md.html">Java中的ThreadLocal.md.html</a>
</li>
<li>
<a href="/文章/Java线程池实现原理及其在美团业务中的实践.md.html">Java线程池实现原理及其在美团业务中的实践.md.html</a>
</li>
<li>
<a href="/文章/Java魔法类:Unsafe应用解析.md.html">Java魔法类:Unsafe应用解析.md.html</a>
</li>
<li>
<a href="/文章/Kafka 源码阅读笔记.md.html">Kafka 源码阅读笔记.md.html</a>
</li>
<li>
<a href="/文章/Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理.md.html">Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理.md.html</a>
</li>
<li>
<a href="/文章/MySQL · 引擎特性 · InnoDB Buffer Pool.md.html">MySQL · 引擎特性 · InnoDB Buffer Pool.md.html</a>
</li>
<li>
<a href="/文章/MySQL · 引擎特性 · InnoDB IO子系统.md.html">MySQL · 引擎特性 · InnoDB IO子系统.md.html</a>
</li>
<li>
<a href="/文章/MySQL · 引擎特性 · InnoDB 事务系统.md.html">MySQL · 引擎特性 · InnoDB 事务系统.md.html</a>
</li>
<li>
<a href="/文章/MySQL · 引擎特性 · InnoDB 同步机制.md.html">MySQL · 引擎特性 · InnoDB 同步机制.md.html</a>
</li>
<li>
<a href="/文章/MySQL · 引擎特性 · InnoDB 数据页解析.md.html">MySQL · 引擎特性 · InnoDB 数据页解析.md.html</a>
</li>
<li>
<a href="/文章/MySQL · 引擎特性 · InnoDB崩溃恢复.md.html">MySQL · 引擎特性 · InnoDB崩溃恢复.md.html</a>
</li>
<li>
<a href="/文章/MySQL · 引擎特性 · 临时表那些事儿.md.html">MySQL · 引擎特性 · 临时表那些事儿.md.html</a>
</li>
<li>
<a href="/文章/MySQL 主从复制 半同步复制.md.html">MySQL 主从复制 半同步复制.md.html</a>
</li>
<li>
<a href="/文章/MySQL 主从复制 基于GTID复制.md.html">MySQL 主从复制 基于GTID复制.md.html</a>
</li>
<li>
<a href="/文章/MySQL 主从复制.md.html">MySQL 主从复制.md.html</a>
</li>
<li>
<a href="/文章/MySQL 事务日志(redo log和undo log).md.html">MySQL 事务日志(redo log和undo log).md.html</a>
</li>
<li>
<a href="/文章/MySQL 亿级别数据迁移实战代码分享.md.html">MySQL 亿级别数据迁移实战代码分享.md.html</a>
</li>
<li>
<a href="/文章/MySQL 从一条数据说起-InnoDB行存储数据结构.md.html">MySQL 从一条数据说起-InnoDB行存储数据结构.md.html</a>
</li>
<li>
<a href="/文章/MySQL 地基基础:事务和锁的面纱.md.html">MySQL 地基基础:事务和锁的面纱.md.html</a>
</li>
<li>
<a href="/文章/MySQL 地基基础:数据字典.md.html">MySQL 地基基础:数据字典.md.html</a>
</li>
<li>
<a class="current-tab" href="/文章/MySQL 地基基础:数据库字符集.md.html">MySQL 地基基础:数据库字符集.md.html</a>
</li>
<li>
<a href="/文章/MySQL 性能优化:碎片整理.md.html">MySQL 性能优化:碎片整理.md.html</a>
</li>
<li>
<a href="/文章/MySQL 故障诊断:一个 ALTER TALBE 执行了很久,你慌不慌?.md.html">MySQL 故障诊断:一个 ALTER TALBE 执行了很久,你慌不慌?.md.html</a>
</li>
<li>
<a href="/文章/MySQL 故障诊断:如何在日志中轻松定位大事务.md.html">MySQL 故障诊断:如何在日志中轻松定位大事务.md.html</a>
</li>
<li>
<a href="/文章/MySQL 故障诊断:教你快速定位加锁的 SQL.md.html">MySQL 故障诊断:教你快速定位加锁的 SQL.md.html</a>
</li>
<li>
<a href="/文章/MySQL 日志详解.md.html">MySQL 日志详解.md.html</a>
</li>
<li>
<a href="/文章/MySQL 的半同步是什么?.md.html">MySQL 的半同步是什么?.md.html</a>
</li>
<li>
<a href="/文章/MySQL中的事务和MVCC.md.html">MySQL中的事务和MVCC.md.html</a>
</li>
<li>
<a href="/文章/MySQL事务_事务隔离级别详解.md.html">MySQL事务_事务隔离级别详解.md.html</a>
</li>
<li>
<a href="/文章/MySQL优化:优化 select count().md.html">MySQL优化:优化 select count().md.html</a>
</li>
<li>
<a href="/文章/MySQL共享锁、排他锁、悲观锁、乐观锁.md.html">MySQL共享锁、排他锁、悲观锁、乐观锁.md.html</a>
</li>
<li>
<a href="/文章/MySQL的MVCC(多版本并发控制).md.html">MySQL的MVCC(多版本并发控制).md.html</a>
</li>
<li>
<a href="/文章/QingStor 对象存储架构设计及最佳实践.md.html">QingStor 对象存储架构设计及最佳实践.md.html</a>
</li>
<li>
<a href="/文章/RocketMQ 面试题集锦.md.html">RocketMQ 面试题集锦.md.html</a>
</li>
<li>
<a href="/文章/SnowFlake 雪花算法生成分布式 ID.md.html">SnowFlake 雪花算法生成分布式 ID.md.html</a>
</li>
<li>
<a href="/文章/Spring Boot 2.x 结合 k8s 实现分布式微服务架构.md.html">Spring Boot 2.x 结合 k8s 实现分布式微服务架构.md.html</a>
</li>
<li>
<a href="/文章/Spring Boot 教程:如何开发一个 starter.md.html">Spring Boot 教程:如何开发一个 starter.md.html</a>
</li>
<li>
<a href="/文章/Spring MVC 原理.md.html">Spring MVC 原理.md.html</a>
</li>
<li>
<a href="/文章/Spring MyBatis和Spring整合的奥秘.md.html">Spring MyBatis和Spring整合的奥秘.md.html</a>
</li>
<li>
<a href="/文章/Spring 帮助你更好的理解Spring循环依赖.md.html">Spring 帮助你更好的理解Spring循环依赖.md.html</a>
</li>
<li>
<a href="/文章/Spring 循环依赖及解决方式.md.html">Spring 循环依赖及解决方式.md.html</a>
</li>
<li>
<a href="/文章/Spring中眼花缭乱的BeanDefinition.md.html">Spring中眼花缭乱的BeanDefinition.md.html</a>
</li>
<li>
<a href="/文章/Vert.x 基础入门.md.html">Vert.x 基础入门.md.html</a>
</li>
<li>
<a href="/文章/eBay 的 Elasticsearch 性能调优实践.md.html">eBay 的 Elasticsearch 性能调优实践.md.html</a>
</li>
<li>
<a href="/文章/不可不说的Java“锁”事.md.html">不可不说的Java“锁”事.md.html</a>
</li>
<li>
<a href="/文章/互联网并发限流实战.md.html">互联网并发限流实战.md.html</a>
</li>
<li>
<a href="/文章/从ReentrantLock的实现看AQS的原理及应用.md.html">从ReentrantLock的实现看AQS的原理及应用.md.html</a>
</li>
<li>
<a href="/文章/从SpringCloud开始,聊微服务架构.md.html">从SpringCloud开始,聊微服务架构.md.html</a>
</li>
<li>
<a href="/文章/全面了解 JDK 线程池实现原理.md.html">全面了解 JDK 线程池实现原理.md.html</a>
</li>
<li>
<a href="/文章/分布式一致性理论与算法.md.html">分布式一致性理论与算法.md.html</a>
</li>
<li>
<a href="/文章/分布式一致性算法 Raft.md.html">分布式一致性算法 Raft.md.html</a>
</li>
<li>
<a href="/文章/分布式唯一 ID 解析.md.html">分布式唯一 ID 解析.md.html</a>
</li>
<li>
<a href="/文章/分布式链路追踪:集群管理设计.md.html">分布式链路追踪:集群管理设计.md.html</a>
</li>
<li>
<a href="/文章/动态代理种类及原理,你知道多少?.md.html">动态代理种类及原理,你知道多少?.md.html</a>
</li>
<li>
<a href="/文章/响应式架构与 RxJava 在有赞零售的实践.md.html">响应式架构与 RxJava 在有赞零售的实践.md.html</a>
</li>
<li>
<a href="/文章/大数据算法——布隆过滤器.md.html">大数据算法——布隆过滤器.md.html</a>
</li>
<li>
<a href="/文章/如何优雅地记录操作日志?.md.html">如何优雅地记录操作日志?.md.html</a>
</li>
<li>
<a href="/文章/如何设计一个亿级消息量的 IM 系统.md.html">如何设计一个亿级消息量的 IM 系统.md.html</a>
</li>
<li>
<a href="/文章/异步网络模型.md.html">异步网络模型.md.html</a>
</li>
<li>
<a href="/文章/当我们在讨论CQRS时,我们在讨论些神马?.md.html">当我们在讨论CQRS时,我们在讨论些神马?.md.html</a>
</li>
<li>
<a href="/文章/彻底理解 MySQL 的索引机制.md.html">彻底理解 MySQL 的索引机制.md.html</a>
</li>
<li>
<a href="/文章/最全的 116 道 Redis 面试题解答.md.html">最全的 116 道 Redis 面试题解答.md.html</a>
</li>
<li>
<a href="/文章/有赞权限系统(SAM).md.html">有赞权限系统(SAM).md.html</a>
</li>
<li>
<a href="/文章/有赞零售中台建设方法的探索与实践.md.html">有赞零售中台建设方法的探索与实践.md.html</a>
</li>
<li>
<a href="/文章/服务注册与发现原理剖析(Eureka、Zookeeper、Nacos).md.html">服务注册与发现原理剖析(Eureka、Zookeeper、Nacos).md.html</a>
</li>
<li>
<a href="/文章/深入浅出Cache.md.html">深入浅出Cache.md.html</a>
</li>
<li>
<a href="/文章/深入理解 MySQL 底层实现.md.html">深入理解 MySQL 底层实现.md.html</a>
</li>
<li>
<a href="/文章/漫画讲解 git rebase VS git merge.md.html">漫画讲解 git rebase VS git merge.md.html</a>
</li>
<li>
<a href="/文章/生成浏览器唯一稳定 ID 的探索.md.html">生成浏览器唯一稳定 ID 的探索.md.html</a>
</li>
<li>
<a href="/文章/缓存 如何保证缓存与数据库的双写一致性?.md.html">缓存 如何保证缓存与数据库的双写一致性?.md.html</a>
</li>
<li>
<a href="/文章/网易严选怎么做全链路监控的?.md.html">网易严选怎么做全链路监控的?.md.html</a>
</li>
<li>
<a href="/文章/美团万亿级 KV 存储架构与实践.md.html">美团万亿级 KV 存储架构与实践.md.html</a>
</li>
<li>
<a href="/文章/美团点评Kubernetes集群管理实践.md.html">美团点评Kubernetes集群管理实践.md.html</a>
</li>
<li>
<a href="/文章/美团百亿规模API网关服务Shepherd的设计与实现.md.html">美团百亿规模API网关服务Shepherd的设计与实现.md.html</a>
</li>
<li>
<a href="/文章/解读《阿里巴巴 Java 开发手册》背后的思考.md.html">解读《阿里巴巴 Java 开发手册》背后的思考.md.html</a>
</li>
<li>
<a href="/文章/认识 MySQL 和 Redis 的数据一致性问题.md.html">认识 MySQL 和 Redis 的数据一致性问题.md.html</a>
</li>
<li>
<a href="/文章/进阶:Dockerfile 高阶使用指南及镜像优化.md.html">进阶:Dockerfile 高阶使用指南及镜像优化.md.html</a>
</li>
<li>
<a href="/文章/铁总在用的高性能分布式缓存计算框架 Geode.md.html">铁总在用的高性能分布式缓存计算框架 Geode.md.html</a>
</li>
<li>
<a href="/文章/阿里云PolarDB及其共享存储PolarFS技术实现分析(上).md.html">阿里云PolarDB及其共享存储PolarFS技术实现分析(上).md.html</a>
</li>
<li>
<a href="/文章/阿里云PolarDB及其共享存储PolarFS技术实现分析(下).md.html">阿里云PolarDB及其共享存储PolarFS技术实现分析(下).md.html</a>
</li>
<li>
<a href="/文章/面试最常被问的 Java 后端题.md.html">面试最常被问的 Java 后端题.md.html</a>
</li>
<li>
<a href="/文章/领域驱动设计在互联网业务开发中的实践.md.html">领域驱动设计在互联网业务开发中的实践.md.html</a>
</li>
<li>
<a href="/文章/领域驱动设计的菱形对称架构.md.html">领域驱动设计的菱形对称架构.md.html</a>
</li>
<li>
<a href="/文章/高效构建 Docker 镜像的最佳实践.md.html">高效构建 Docker 镜像的最佳实践.md.html</a>
</li>
</ul>
</div>
</div>
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
<div class="sidebar-toggle-inner"></div>
</div>
<script>
function add_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.add('show')
}
function remove_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.remove('show')
}
function sidebar_toggle() {
let sidebar_toggle = document.querySelector('.sidebar-toggle')
let sidebar = document.querySelector('.book-sidebar')
let content = document.querySelector('.off-canvas-content')
if (sidebar_toggle.classList.contains('extend')) { // show
sidebar_toggle.classList.remove('extend')
sidebar.classList.remove('hide')
content.classList.remove('extend')
} else { // hide
sidebar_toggle.classList.add('extend')
sidebar.classList.add('hide')
content.classList.add('extend')
}
}
function open_sidebar() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.add('show')
overlay.classList.add('show')
}
function hide_canvas() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.remove('show')
overlay.classList.remove('show')
}
</script>
<div class="off-canvas-content">
<div class="columns">
<div class="column col-12 col-lg-12">
<div class="book-navbar">
<!-- For Responsive Layout -->
<header class="navbar">
<section class="navbar-section">
<a onclick="open_sidebar()">
<i class="icon icon-menu"></i>
</a>
</section>
</header>
</div>
<div class="book-content" style="max-width: 960px; margin: 0 auto;
overflow-x: auto;
overflow-y: hidden;">
<div class="book-post">
<p id="tip" align="center"></p>
<div><h1>MySQL 地基基础:数据库字符集</h1>
<h3>字符集简介</h3>
<p>字符是各种文字和符号的总称,而字符集是多个字符的集合。</p>
<h3>字符集分类与特点</h3>
<p>字符包含有国家文字、标点符号、图形符号、数字等内容,字符集是多个字符的集合,字符集种类非常多,每种字符集包含的字符个数是不相同的。比如说,国家文字不同,就会使用各自国家通用字符集,这样是不是好理解一些。</p>
<p><strong>常见字符集分类</strong></p>
<ul>
<li>ASCII(American Standard Code for Information Interchange,美国信息互换标准编码):是基于罗马字母表的一套电脑编码系统,一个字节表示一个字符。</li>
<li>LATIN1:ASCII 字符集的扩充,仍然使用一个字节表示一个字符。</li>
<li>GB2312(信息交换用汉字编码字符集·基本集):中国国家标准的简体中文字符集,基本满足了汉字的计算机处理需要,分区表示,双字节表示一个字符。</li>
<li>GB18030(信息交换用汉字编码字符集基本集的扩充):是 GB2312 的扩充,更全面,兼容 Unicode 3.0 和 GB2312。</li>
<li>UTF-8(Unicode Tranformation Format):是 Unicode 的其中一个使用方式,支持所有国家字符集,使用 1-4 个字节表示一个字符。</li>
</ul>
<p>字符集有很多,这里不一一列举。想要获取全部支持字符集,可以在库中查看,详见下文。</p>
<p><strong>字符集特点</strong></p>
<ul>
<li>不同的编码方式,最终解释为不同的机器语言(二进制)</li>
<li>不同的表示方式,使用 1 个或者多个字节表示一个字符</li>
</ul>
<h3>MySQL 与字符集之间亲密关系</h3>
<p>首先我们想一下,数据库是做什么的?数据库是存放数据的环境。这些数据库是如何保存的?拍拍脑袋一想,肯定不是原封不动的存放的,数据库不同于我们的大脑,它的思维能力甚至不如阿猫阿狗,它只能读懂 0 和 1,那么数据库存储的数据,其实就是一串串的 0 和 1 的组合,那么按照什么规则定义这些 0 和 1 呢?重点来了,数据库需要在字符集中找到对应的数据编码,然后存储的是这些编码。</p>
<p>MySQL 字符集包括字符集(character)和校对规则(collation),字符集用来定义存储字符串的方式,校队规则定义比较字符串的方式。字符集和校对规则是一对多的关系,每个字符集至少对应一个校对规则。后面我们在具体说说校对规则。</p>
<p>MySQL 在底层存储上有四个级别的字符集设置,分别是:服务器级、数据库级、表级、列级。字符集优先级是:列字符集 > 表字符集 > 数据库字符集 > 服务器字符集,其中最常用的是表级和数据库级字符集。列级字符集最优先,但是一般不单独设置,使其继承表级字符集。</p>
<p>获取所有数据库字符集:</p>
<pre><code>mysql> show character set;
或者
mysql> select * from information_schema.character_sets;
</code></pre>
<p>获取所有数据库校对规则:</p>
<pre><code>mysql> show collation;
或者
mysql> select * from information_schema.collations;
</code></pre>
<h3>字符集编码原理</h3>
<p>在客户端和服务器端之期间的数据请求与反馈,会经历一系列的转换,从而保证数据的正确无误无乱码,下面具体说一下这个请求的过程。</p>
<p>\1. MySQL client 发送请求(字符集为 character_set_client)
character_set_client 就是客户端字符集。</p>
<p>\2. MySQL Server 收到请求,将请求数据从 character_set_client 转换为 character_set_connection
通常情况下 character_set_connection 字符集同 character_set_client 字符集一致。</p>
<p>\3. MySQL Server 将请求数据从 character_set_connection 转换为内部操作字符集。</p>
<p>何为内部操作字符集,其实就是前面说的列字符集、表字符集、数据库字符集、服务器字符集这四个。这一步操作会使用每个数据字段的 CHARACTER SET 设定值:</p>
<ul>
<li>如果 CHARACTER SET 不存在,使用表字符集</li>
<li>如果表字符集不存在,使用数据库字符集</li>
<li>如果数据库字符集不存在,使用服务器字符集</li>
</ul>
<p>\4. MySQL Server 将操作结果从内部操作字符集转换为 character_set_results
character_set_results 就是结果内容的字符集。</p>
<h3>字符集与校对规则分析</h3>
<p>前面我们已经说了说字符集和校对规则的关系。接下来我们具体分析分析它们。</p>
<p>查看数据库字符集:</p>
<pre><code>mysql> show variables like 'character%';
</code></pre>
<p><img src="assets/8d9f1a10-436e-11eb-8894-3bfce9c9c7d8" alt="在这里插入图片描述" /></p>
<p>参数解释:</p>
<ul>
<li>character_set_client:客户端使用的字符集</li>
<li>character_set_connection:客户端和服务端连接层字符集</li>
<li>character_set_database:默认数据库字符集 ,如没有默认数据库,会用 character_set_server 指定的字符集,建议由系统自动管理</li>
<li>character_set_filesystem:把 os 上文件名转化成此字符集,把 character_set_client 转换 character_set_filesystem, 默认 binary 是不做任何转换</li>
<li>character_set_results:结果字符集</li>
<li>character_set_server:数据库服务器字符集</li>
<li>character_set_system:操作系统字符集,无需设置,总是 utf8</li>
</ul>
<p>DDL 字符集选择:</p>
<ul>
<li>建库操作,未指定数据库字符集,继承数据库服务器字符集</li>
<li>建表操作,未指定表字符集,继承当前库字符集</li>
<li>新增字段,未指定列字符集,继承表字符集</li>
<li>修改字段,未指定列字符集,继承表字符集</li>
</ul>
<p>DML 字符集选择:</p>
<ul>
<li>插入、更新数据,由 character_set_client 转换为 character_set_connection 再转换为表字符集</li>
</ul>
<p>查看字符集校对规则:</p>
<pre><code>mysql> show variables like 'collation%';
</code></pre>
<p><img src="assets/0404e580-4370-11eb-b1e3-0b8acb9b8f06" alt="在这里插入图片描述" /></p>
<p>参数说明:</p>
<ul>
<li>collation_connection:当前连接的字符集校对规则</li>
<li>collation_database:当前数据库默认校对规则</li>
<li>collation_server:当前数据库服务器默认校对规则</li>
</ul>
<p>字符集和校对规则:</p>
<ul>
<li>每个字符集至少有一个校对规则</li>
<li>每个字符集有一个默认的校对规则</li>
<li>每个校对规则只能属于一个字符集</li>
</ul>
<p><strong>校对规则命名</strong></p>
<p>字符集名称_语言_后缀,其中后缀有三种写法:</p>
<ul>
<li>_ci:不区分大小写</li>
<li>_cs:区分大小写</li>
<li>_bin:二进制</li>
</ul>
<h3>如何更改 MySQL 字符集</h3>
<p>更改数据库字符集:</p>
<pre><code>alter database db1 default character set utf8;
</code></pre>
<p>更改数据库表的字符集:</p>
<pre><code>alter table tab1 default character set utf8;
</code></pre>
<p>把表默认的字符集和所有字符列改为新的字符集(例如 utf8):</p>
<pre><code>alter table tab1 convert to character set utf8;
</code></pre>
<p>前面的操作转换了字符集之间的列类型。如果有一列使用一种字符集(如 latin1),但是存储的值实际上使用了其它的字符集(如 utf8),这种情况不是你想要的,进行如下操作就可以解决你的问题。</p>
<pre><code>alter table tab1 change 字段 1 字段 2 类型;
alter table tab1 change 字段 2 字段 2 类型 character set utf8;
</code></pre>
<h3>字符集最佳实践</h3>
<p>MySQL 数据库字符集和校对规则有 4 个级别:服务器级、数据库级、表级、字段级,下面我们重点讲解及用实例操作来实践。</p>
<h4>服务器级设置字符集</h4>
<p><strong>方式一</strong></p>
<p>在 MySQL 配置文件 my.cnf 中进行配置设置:</p>
<pre><code>[mysqld]
default-character-set=gbk
</code></pre>
<p><strong>方式二</strong></p>
<p>在启动 MySQL 时设置:</p>
<pre><code>mysqld --default-character-set=gbk
</code></pre>
<p><strong>方式三</strong></p>
<p>在源码编译时指定,如果未指定,默认使用 latin1:</p>
<pre><code>./configure --with-charcter=gbk
</code></pre>
<h4>数据库级设置字符集</h4>
<ul>
<li>创建数据库时指定字符集(create database ... )</li>
<li>修改数据库时修改字符集(alter database ...)</li>
</ul>
<p>注:对于已经存在的数据修改字符集无效。</p>
<h4>表级设置字符集</h4>
<ul>
<li>创建表时指定字符集(create table ...)</li>
<li>修改表时修改字符集(alter table ...)</li>
</ul>
<p>注:对于已经存在的数据修改字符集无效。</p>
<h4>列级设置字符集</h4>
<ul>
<li>创建表时指定列字符集(create table ...)</li>
<li>修改表时修改列字符集(alter table ...)</li>
</ul>
<p>注:对于已经存在的数据修改字符集无效。</p>
<p>细心的朋友应该已经注意到了,以上这种修改是不适用于已经存在的数据的,如果表中已经存在数据了,那么我们怎样修改字符集呢?不要着急,后面会一步一步的教你如何实现。</p>
<p>首先我们先实例说一下如何设置字符集。</p>
<p><strong>1. 为数据库设置字符集和校对规则</strong></p>
<p>设置数据库字符集:</p>
<pre><code>create database db1 default character set utf8;
</code></pre>
<p>设置数据库校对规则:</p>
<pre><code>create database db1 default character set utf8 collate utf8_bin;
</code></pre>
<p>说明:</p>
<ul>
<li>如果指定了字符集和校对规则,则使用指定的</li>
<li>如果指定了字符集未指定校对规则,则使用指定字符集和默认校对规则</li>
<li>如果未指定字符集和校对规则,则使用服务器字符集和校对规则</li>
</ul>
<p><strong>2. 为表设置字符集和校对规则</strong></p>
<p>设置表字符集:</p>
<pre><code>create table tab1(column1 varchar(5)) default character set utf8;
</code></pre>
<p>设置表校对规则:</p>
<pre><code>create table tab1(column1 varchar(5)) default character set utf8 collate utf8_bin;
</code></pre>
<p>说明:</p>
<ul>
<li>如果指定了字符集和校对规则,则使用指定的</li>
<li>如果指定了字符集未指定校对规则,则使用指定字符集和默认校对规则</li>
<li>如果未指定字符集和校对规则,则使用数据库字符集和校对规则</li>
</ul>
<p><strong>3. 为列设置字符集和校对规则</strong></p>
<p>设置列字符集:</p>
<pre><code>create table tab1(column1 varchar(5) character SET utf8);
</code></pre>
<p>设置列校对规则:</p>
<pre><code>create table tab1(column1 varchar(5) character set utf8 collate utf8_bin);
</code></pre>
<p>说明:</p>
<ul>
<li>如果指定了字符集和校对规则,则使用指定的</li>
<li>如果指定了字符集未指定校对规则,则使用指定字符集和默认校对规则</li>
<li>如果未指定字符集和校对规则,则使用表字符集和校对规则</li>
</ul>
<p><strong>4. 如何处理带数据的字符集</strong></p>
<p>当表中已经存在数据,直接更改字符集,不会更改既有的数据字符集,我们需要先将数据导出,调整字符集再导入。</p>
<p><strong>第一步:导出表结构</strong></p>
<pre><code>mysqldump -uroot -p --default-character-set=gbk -d db1> createtab.sql
</code></pre>
<p><strong>第二步:修改表字符集</strong></p>
<p>编辑修改 createtab.sql 文件,将表结构定义中的字符集改为新的字符集。</p>
<p><strong>第三步:导出所有数据</strong></p>
<pre><code>mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 db1> data.sql
</code></pre>
<p><strong>第四步:修改数据字符集</strong></p>
<p>编辑修改 data.sql,将 set names latin1 修改成 set names gbk。</p>
<p><strong>第五步:创建数据库</strong></p>
<pre><code>create database db1 default charset gbk;
</code></pre>
<p><strong>第六步:创建表</strong></p>
<pre><code>mysql -uroot -p db1 < createtab.sql
</code></pre>
<p><strong>第七步:导入数据</strong></p>
<pre><code>mysql -uroot -p db1 < data.sql
</code></pre>
</div>
</div>
<div>
<div style="float: left">
<a href="/文章/MySQL 地基基础:数据字典.md.html">上一页</a>
</div>
<div style="float: right">
<a href="/文章/MySQL 性能优化:碎片整理.md.html">下一页</a>
</div>
</div>
</div>
</div>
</div>
</div>
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
</div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"70997ff66f0d8b66","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
</body>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-NPSEEVD756');
var path = window.location.pathname
var cookie = getCookie("lastPath");
console.log(path)
if (path.replace("/", "") === "") {
if (cookie.replace("/", "") !== "") {
console.log(cookie)
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
}
} else {
setCookie("lastPath", path)
}
function setCookie(cname, cvalue) {
var d = new Date();
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
}
return "";
}
</script>
</html>