本文虽说旨在明白、但若略懂亦可、毕竟诸葛孔明如是
     只有基于字符的值才有所谓字符集的概念
     某些字符集可能需要更多CPU、消费更多的内存和磁盘空间、甚至影响索引使用
     这还不包括令人蛋碎的乱码、
     可见、我们还是有必要花点时间略懂下MySQL字符集

先直观认识各阶梯下显示使用字符集:

# 囊括三个层级:DB、Table、Column

mysql> create database d charset utf8;
Query OK, 1 row affected (0.04 sec) mysql> create table d.t
-> (str varchar(10) charset latin1)
-> default charset=utf8;
Query OK, 0 rows affected (0.05 sec)

那如果没有显示指定?MySQL是如何设置?路分两条:
     
     ① 创建对象时的默认设置
        
        这是个逐层继承的默认设置:
        Server → DB → Table → Column
        高层为底层设置默认值、底层可遵可弃、
        没有指定字符集、谓之可遵
        显示指定字符集、谓之可弃
        
     ② 服务器和客户端通信时的设置
        
        当客户端提交一条SQL到MySQL时、MySQL Server总是假定客户端字符集是character_set_client
        其后、Server把character_set_client转为character_set_connection进行SQL处理、
        在返回结果集给客户端时、Server又将character_set_connection转为character_set_result、然后返回
        
        以上涉及的三个字符集、我们可以通过set names 一次搞定
        
     
     字符集之间的相互转换是需要额外的系统开销的、
     如何知道?
     explain extended + show warnings 即可
     
     那该如何尽量避免这种隐式转换?
     这里介绍一种被称为"极简原则"的方法、如下:
     先为服务器(或数据库)选择合适的字符集、然后依据业务、让某些列选择合适的字符集
     
     在MySQL字符集中隐含了些意外惊喜、主要有三:
     
     ① 有趣的character_set_database
        
        当character_set_database和character_set_server不同时、库的默认字符集由后者决定
        你不能直接修改csd、改变css就改变了csd、因为csd和库默认字符集相同、
        改变库默认字符集、csd就随之改变、而css决定库的默认字符集
        所以、当连接到mysql实例、又没有指定库时、默认字符集与css相同
        
     ② load data infile 
        
        进行此操作时、建议最佳实践如下:
        use 库;
        set names 字符集;
        开始加载数据;
        这就使用统一字符集、避免混搭的"字符集style"
        
     ③ select into outfile 
        
        该行为没有进行任何转码操作!
        
     
     有人说、不管37二十一、全用utf8、整个世界都清净了
     但这不仅消耗更多磁盘空间、也带来一定性能牺牲
     为什么?因为utf8是多字节字符集、比如一个汉字是三个字节
     这会带来两方面的问题:
     ① 浪费空间、如char(10)可能会开辟30字节空间、即使不需要
     ② 索引长度限制、mysql总是假定一个字符三个字节、导致最长索引长度变成1/3

行文至此、大意已明、后续想到、再续前缘

By WaterBin

2013-07-18

Good LUck

略懂 MySQL字符集的更多相关文章

  1. 再见乱码:5分钟读懂MySQL字符集设置

    一.内容概述 在MySQL的使用过程中,了解字符集.字符序的概念,以及不同设置对数据存储.比较的影响非常重要.不少同学在日常工作中遇到的"乱码"问题,很有可能就是因为对字符集与字符 ...

  2. MySQL字符集编码

    MySQL字符集编码总结 之前内部博客上凯哥分享了一篇关于mysql字符集的文章,之前我对mysql字符集一块基本没有深究过,看到凯哥文章后有些地方有点疑惑,遂自己去看了mysql的官方文档,并參考了 ...

  3. MySQL字符集与排序规则总结

      字符集与排序规则概念 在数据库当中都有字符集和排序规则的概念, 很多开发人员甚至包括有些DBA都会将这个混淆,当然这个情况也有一些情有可原的原因.一来两者本来就是相辅相成,相互依赖关联: 另外一方 ...

  4. 从一个慢查询到MySQL字符集编码

    从一个慢查询到MySQL字符集编码 目录 从一个慢查询到MySQL字符集编码 1. 问题起源 2. MySQL字符集和字符集排序规则 2.1 字符集相关概念 2.2 MySQL中的字符集和字符集排序规 ...

  5. 如何修改MySQL字符集

    首先,MySQL的字符集问题主要是两个概念,一个是Character Sets,一个是Collations,前者是字符内容及编码,后者是对前者进行比较操作的一些规则.这两个参数集可以在数据库实例.单个 ...

  6. Mysql字符集设置

    转 基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如’A'.’B'等:• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encodi ...

  7. MySQL字符集

    字符集的选择 1.如果数据库只需要支持中文,数据量很大,性能要求也很高,应该选择双字节定长编码的中文字符集(如GBK).因为相对于UTF-8而言,GBK"较小",每个汉字只占2个字 ...

  8. mysql5.5字符集设置的一点变化(对于中文乱码问题,需要设置mysql字符集)

    工作中因为字符集问题没少头疼,还犯过一次错误,还好拯救及时,没有发生重大事故,唉,弄清楚点还是非常有必要的: 例如我的工作环境为CTR+redhat5+mysql5.5 在导入sql语句的时候必须要注 ...

  9. Mysql字符集知识总结

    字符集&字符编码方式 字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,这里的字符可以是英文字符,汉字字符,或者其他国家语言字符. 常见字符集 ...

随机推荐

  1. cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(五)-地图卷动

    马里奥在平移的过程中,涉及到地图的卷动问题. 在这个游戏里,地图比窗口大,窗口只是显示了地图的一部分,因此马里奥在移动的时候,移动到一定位置之后要卷动地图,否则马里奥移动到窗口右边之后......那结 ...

  2. Roseonly:互联网轻奢品牌之路-搜狐IT

    Roseonly:互联网轻奢品牌之路-搜狐IT Roseonly:互联网轻奢品牌之路

  3. 小程序员在android移动应用上的赚钱经历

    先说说我自己吧,二线城市(以外包为主)的小程序员,工作多年了,月收入5-6K.主要从事asp.net web网站开发,java,c++,php,ruby都懂一些,属于那种对问题不求甚解型,爱好电脑游戏 ...

  4. Spring基于 Annotation 的简单介绍

    tyle="margin:20px 0px 0px; font-size:14px; line-height:26px; font-family:Arial"> 1.使用 @ ...

  5. STL 源代码剖析 算法 stl_algo.h -- partition

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie partition ------------------------------------ ...

  6. [Swust OJ 322]--东6宿舍灵异事件(中缀表达式转化为后缀表达式的简单运用)

    题目链接:http://acm.swust.edu.cn/problem/322/ Time limit(ms): 1000 Memory limit(kb): 65535     Descripti ...

  7. 树莓派常用Linux命令

    转自小五义 1.ls命令:列出文件目录的常用命令,主要参数见下表. -a 列出目录下的所有文件,包括以.开头的隐含文件. -b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列 ...

  8. 在VC6.0中能不能使用Duilib界面库呢?

    Duilib库的源代码是在vs2010下编译的,一般适用于vs2008及以上的版本开发使用,那么duilib能不能在vc6.0的工程中使用呢?如何在vc6.0中使用duilib库呢? 今天,由于工作要 ...

  9. android如何添加桌面图标和卸载程序后自动删除图标

    android如何添加桌面图标和卸载程序后自动删除桌面图标,这是一个应用的安装与卸载过程对桌面图标的操作,下面与大家分享下具体是如何实现的,感兴趣的朋友可以参考下哈 1:创建图标如下 Intent i ...

  10. 金融管理 - MBA智库百科

    金融管理 - MBA智库百科     金融管理    出自 MBA智库百科(http://wiki.mbalib.com/)     金融管理(Financial Management)    目录  ...