安装MySQL好多次了,每次都会纠结于数据库的字符编码配置,所以我决定这一次彻底把它理清。

MySQL的字符编码结构比較细,它慷慨向分为两个部分:数据存储编码和传输数据编码。本篇讨论数据存储编码部分,传输数据编码在下一篇MySQL的字符编码体系(二)——传输数据编码中讨论。

编码层次

数据存储的字符编码配置是指定数据库中存储的数据默认採用什么字符编码。默认字符编码的设置分为四个层次:server级、数据库级、数据表级和列级。

也就是说。能够为server设置一个默认字符编码,再为server中的每个数据库设置不同的默认编码。再为同一个数据库中的每个数据表设置不同的默认编码,再为同一个数据表中的每个列设置不同的默认编码。

MySQL数据库server的逻辑结构

那这四个层次的编码设置究竟怎样起作用呢?假设新建数据库时没有指定字符编码,就默认设置为server的编码;假设新建数据表时没有指定不论什么编码,就默认设置为数据库的编码;假设向数据表加入新列或新建数据表时没有特别指定某些列的编码,那么这些列就默认设置为数据表的编码。注意这里四个层次的编码都是作为“默认”的存在,用户创建数据库、表或添加列时直接指定的编码是最优先的。

还有一方面,直接改变这四个层次的编码并不会改变它们各自全部下层对象的当前编码。比方改动仅仅Server级,那么全部已经存在的数据库的默认编码不变,数据表、表列以及每一行现有数据记录的字符编码都不变,可是假设新建一个数据库且不指定其默认编码,那它的默认编码就会被设置为Server的默认编码;相同即使改动了全部四个层次的编码。可是数据表中每一条现有记录的字符字段仍然是按原来的编码存储的,可是假设向数据表中新插入一条记录,数据库将依据数据表当前各列的默认编码来存储该条记录的各个字符字段。

设置方法

改动Server下面各级编码的SQL语句例如以下:

ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] CHARACTER SET [=] charset_name
ALTER TABLE dbl_name [DEFAULT] CHARACTER SET [=] charset_name
ALTER TABLE dbl_name MODIFY [COLUMN] col_name {CHAR[(length)] | TEXT} CHARACTER SET charset_name

注意上面第三条改动列字符编码,实际上是通过全然又一次定义列属性的方式实现的,语法跟创建新数据表时指定列字段属性一样的。所以假设这里仅仅是想改动列字符编码,那就必须完整地写上创建该列时使用的全部定义修饰。

改动Server默认编码能够通过执行时直接改动变量character_set_server实现。但这样是暂时性的,client关闭重新启动后又会自己主动恢复。

要想永久改变Server默认编码须要在my.ini或my.cnf配置文件的“[mysqld]”区域中设定该变量的值,然后重新启动服务器:

[mysqld]
character_set_server=charset_name

MySQL的字符编码体系(一)——数据存储编码的更多相关文章

  1. Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结

    Atitit 研发体系建立 数据存储与数据知识点体系知识图谱attilax 总结 分类具体知识点原理规范具体实现(oracle,mysql,mssql是否可以自己实现说明 数据库理论数据库的类型 数据 ...

  2. MySQL的字符编码体系(二)——传输数据编码

    MySQL的字符编码体系能够分成两部分:一部分是关于数据库server本身存储数据表时怎样管理字符数据的编码:还有一部分是关于client与数据库server数据传输怎样编码.上一篇MySQL的字符编 ...

  3. centos 7.1系统更改Mariadb数据存储位置步骤分享

    一.首先确保你要更改Mariadb数据存储的位置的空间够大 现在已将Mariadb存储位置更改到/opt/目录下 1.然后将Mariadb服务stop:systemctl stop mariadb 2 ...

  4. MySQL学习笔记之数据存储类型

    说明:本文是作者对MySQL数据库数据存储类型的小小总结. Numeric Type (数字类型) 1.TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT主要根据存储字节长度不 ...

  5. Mysql 的字符编码机制、中文乱码问题及解决方案【转载】

    本文转载自:http://hi.baidu.com/huabinyin/item/7f51e462df565c97c4d24929.感谢作者及相关博主.        相信很多朋友都会对字符编码敬而远 ...

  6. 拨开字符编码的迷雾--MySQL数据库字符编码

    拨开字符编码迷雾系列文章链接: 拨开字符编码的迷雾--字符编码概述 拨开字符编码的迷雾--编译器如何处理文件编码 拨开字符编码的迷雾--字符编码转换 拨开字符编码的迷雾--MySQL数据库字符编码 1 ...

  7. 前端网页、php与mysql数据库字符编码(解决中文等乱码问题)

    web开发中经常涉及前端网页——php——mysql之间的数据交互,当数据只有英文时通常不会有什么问题,但一旦涉及中文,三个地方的某一处字符编码不一致(如,网页使用的时gbk而mysql使用utf-8 ...

  8. Python2爬虫获取的数据存储到MySQL中时报错"Incorrect string value: '\\xE6\\x96\\xB0\\xE9\\x97\\xBB' for column 'new' at row 1"的解决办法

    由于一直使用python3进行编码,在使用Python2时,将爬虫数据连接数据库进行存储时,出现如上的报错,经查资料 是数据库编码问题. 如下转自:http://www.cnblogs.com/liu ...

  9. ubuntu下修改mysql默认字符编码出现的Job failed to start解决办法

    ubuntu下修改mysql默认字符编码出现的Job failed to start解决办法 前几天卸掉了用了好多年的Windows,安装了Ubuntu12.04,就开始各种搭环境.今天装好了MySQ ...

随机推荐

  1. 如何用纯 CSS 创作一盘传统蚊香

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/BVpvMz 可交互视频教 ...

  2. link与@import导入css样式区别

    XML/HTML代码<link rel="stylesheet" rev="stylesheet" href="CSS文件" type ...

  3. PAT Basic 1028

    1028 人口普查 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而 ...

  4. Experiments done

    喷重金属 换重金属溶液 荧光光合 备注 ASD 备注 高光谱 备注 泡EDTA 备注 电镜 备注 2018.12.19(day1) 2018.12.19(day1) 2018.12.18晚(day0) ...

  5. Hibernate框架的主键生成策略

    在Hibernate中,id元素的<generator>子元素用于生成持久化类的对象的唯一标识符,也就是主键.Hibernate框架中定义了许多主键生成策略类,也叫生成器类.所有的生成器类 ...

  6. luogu1131 [ZJOI2007]时态同步

    num[x]表示x到达叶子最远路径. 每个子节点对答案的贡献是num[x] - (num[t] + edge[i].val) #include <iostream> #include &l ...

  7. performSelectorOnMainThread

    在多线程操作中,有一个著名的错误,叫做"Tried to obtain the web lock from a thread other than the main thread or th ...

  8. hdu2022

    #include <stdio.h> #include <math.h> #define here puts("go,go,go!\n") int main ...

  9. shell-001

    for: shell_test #!/bin/bash var= var=$var+ echo $var mkdir only_a_joke shell_joke #!/bin/bash ./shel ...

  10. NOIP一系列模拟赛小结

    NOIP越发接近了,于是自己也跟着机房的几位师兄一起做了几次NOIP模拟赛,收获颇多. #1-T1:求点集中的点能否只用三条与坐标轴平行的直线就能全部被经过,其实只要将横纵坐标排序后逐个点检查下就行. ...