字符集的选择
    1.数据库方面最流行的是UTF-8
    2.如果只考虑支持汉字,那么使用GBK,毕竟GBK下,每个汉字只占用2个字节,而UTF-8需要3个字节.
    3.如果需要做大量的字符运算,如比较/排序等,选择 定长字符集 比较好.
    4.如果所有客户端程序都支持相同的字符集,优先选择该字符集.避免因字符集转换带来的性能开销以及数据损失.
    
    
MySQL支持的字符集简介:
    MySQL服务器可以支持多种字符集.同一台服务器,同一个数据库,甚至同一个表中的不同字段都可以指定不同的字符集.(Oracle同一个数据库只能使用相同的字符集)
 
    查看所有可用的字符集:
        SHOW CHARACTER SET ;
    或者查看information_schema.character_sets表
        DESC information_schema.character_sets ;
 
    查看字符集所对应的校对规则(一对多关系)
        SHOW COLLATION LIKE '***' ; -- 如LIKE 'gbk%'
        校对规则的命名约定 :
            字符集名[_语言名]_后缀
        后缀包括: ci(大小写不敏感) , cs(大小写敏感) , bin(基于二进制比较,和语言本身无关).
        例如: gbk_chinese_ci , gbk_bin ...
 
        SELECT
            CASE WHEN 'A'  COLLATE gbk_chinese_ci = 'a'
            THEN
                1
            ELSE
                0
            END ;
        --结果返回 1
 
 
MySQL 字符集设置:
    字符集和校对规则有4个级别的默认设置:服务器级,数据库级,表级,字段级(列级).
 
    a.服务器字符集和校对,在MySQL服务启动的时候确定.
     1).在my.cnf中设置
          [mysqld]
          default-character-set=gbk
 
     2).在启动选项中指定
          mysqld --default-character-set= gbk
 
     3).在编译的时候指定 todo how?
          ./configure --with-charset=gbk
 
      如果没有指定服务器的字符集,则默认使用latin1作为服务器的字符集.
      以上三种方式都只指定了字符集,并未指定校对规则.
      查询当前服务器的字符集和校对规则:
        SHOW VARIABLES LIKE 'character_set_server'; --查看服务器字符集
        SHOW VARIABLES LIKE 'collation_server' ;   --查看服务器字符集对应的校对规则
 
    b.数据库级字符集和校对规则
        可以在创建数据库的时候指定,也可以通过ALTER DATABASE 语句进行修改.
        但是采用ALTER TABLE 方式时 : 如果该数据库中已经有数据, 更改字符集并不会对已经存在的数据进行转换,需要使用其他方法.
 
        指定了字符集和校对规则,则使用它们;
        指定了字符集,没有指定校对规则,使用默认校对规则;
        没有指定字符集和校对规则,使用服务器级别的字符集和校对规则.
 
        推荐在创建数据库的时候明确指定字符集和校对规则,避免收到默认值的影响.
 
        查看当前数据库的字符集和校对规则:
            SHOW VARIABLES LIKE 'charcater_set_database' ;
            SHOW VARIABLES LIKE 'collation_database' ;
 
 
    c.表级字符集和校对规则
        推荐在创建表的时候明确指定字符集和校对规则.
        CREATE TABLE t (
            id BIGINT(10) NOT NULL AUTO_INCREAMENT
            , PRIMARY KEY(id)
        ) ENGINE=MyISAM CHARSET=utf8 COLLATE=utf8_bin ;
        使用SHOW CREATE TABLE tbl_name 语句查看.
 
    d.列的字符集和校对规则
        这种遇到的几率很小.
 
 
 
连接字符集和校对规则: 指客户端与服务器的连接
    MySQL 提供了3个参数,分别是character_set_client , character_set_connection以及character_set_results
    一般来讲这三个需要保持一致,才可以保证用户写入的数据能被正确的读出.
 
    因此,不会单独设置这三个参数,而是一起设置,通过以下命令.
    SET NAMES *** ; --这种方式,需要应用每次连接数据库都要执行.
    更简单的方式,在my.cnf中设置
    [mysqld]
    default-character-set=xxx
 
    这样所有连接默认的字符集都是xxx,不需要执行SET NAMES了.
 
 
 
字符集的修改步骤
    针对,想同时更改已有数据的字符集的情况.
 
    1).导出表结构
        mysqldump -uroot -p --default-character-set=old_charset -d database_name [ tbl_name ]> xxx.sql
        其中, -d 表示只导出表结构,不导出数据
        如果导出某个数据库中的所有表 , 省略 tbl_name ; 反之,指定要导出数据的表名tbl_name.
 
    2).手动更改xxx.sql中的表结构定义的字符集为新的字符集
 
    3).确保记录不再更新的情况下,导出所有记录
        mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=old_charset  database_name [ tbl_name ] > data.sql
        其中 --quick :                            用于转储大的表.它强制mysqldump从服务器一次一行的检错表中的行,而不是一次性全部检索,并在输出前缓存到内存中.
        --no-create-info:                        不写重新创建每个转储表的CREATE TABLE 语句.
        --default-character-set= old_charset : 按照原有的字符集导出所有数据,不会乱码.
        —extended-insert : 这样插入语句 会是多条insert语句,性能好,mysql默认是这种. 
 
    4).打开data.sql , 将SET NAMES old_charset 修改成 SET NAMES new_charset ;
 
    5).使用新的字符集创建新的数据库
        CREATE DATABASE new_database_name default charset new_charset ;
 
    6).创建表,执行xxx.sql
        mysql -uroot -p new_database_name < xxx.sql ;
 
    7).导入数据 , 执行data.sql
        mysql -uroot -p new_database_name < data.sql ;
 

09 MySQL字符集的更多相关文章

  1. mysql字符集小结

    http://blog.csdn.net/wyzxg/article/details/8779682 author:skatetime:2013/04/09 mysql字符集小结 今天同事阿杰兄发现内 ...

  2. MySQL字符集转换引发插入乱码问题

    根据http://www.cnblogs.com/cchust/p/4601536.html进行验证测试 问题背景 在mysql上面执行一条普通的insert语句,结果报错: Incorrect st ...

  3. linux(Ubuntu)下mysql字符集完美解决

    本文参考: 1. http://www.blogjava.net/wldandan/archive/2007/09/04/142669.html 2. http://chinaapp.sinaapp. ...

  4. 实战分析: MySQL字符集

    原创: 吴炳锡 MySQLBeginner 实战分析: MySQL字符集说明 在本文中讨论以下几个问题: 1. GBK和UTF8占用几个字节 2. ASCII码在不同字符集中占用几个字节 3. MyS ...

  5. 查看修改MySQL字符集

    查看修改MySQL字符集 http://blog.sina.com.cn/s/blog_70ac6bec01016fts.html 查看修改MySQL字符集 (2012-08-22 09:53:21) ...

  6. MySQL字符集不一致导致性能下降25%,你敢信?

    故事是这样的: 我在对MySQL进行性能测试时,发现CPU使用率接近100%,其中80%us, 16%sys,3%wa,iostat发现磁盘iops2000以下,avgqu-sz不超过3,%util最 ...

  7. 如何修改MySQL字符集

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

  8. Mysql字符集设置

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

  9. MySQL字符集

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

随机推荐

  1. 孤荷凌寒自学python第103天认识区块链017

    [主要内容] 今天继续分析从github上获取的开源代码怎么实现简单区块链的入门知识,共用时间25分钟. (此外整理作笔记花费了约34分钟) 详细学习过程见文末学习过程屏幕录像. 今天所作的工作是进一 ...

  2. 本机配置集群主机名访问(Windows配置hosts)

    Windows配置hosts C:\Windows\System32\drivers\etc\hosts 主机IP 主机名 示例: 192.168.1.1 master 192.168.1.2 sla ...

  3. 粘性session和非粘性session

             粘性session就是指,apache服务器会把某个用户的请求,交给tomcat集群中的一个节点,以后此节点就负责该保存该用户的session,如果此节点挂掉,那么该用户的sessi ...

  4. SVN团队开发项目工具(安装以及使用)

    https://pan.baidu.com/s/1jJyo9ue  密码:ce9z

  5. Windows 网络显示监视器软件_spacedesk

    将各种设备拓展为 Windows 第二屏幕 官方网站 https://spacedesk.net/ 使用教程参阅: https://blog.csdn.net/sinat_21902709/artic ...

  6. 吴裕雄--天生自然PYTHON爬虫:用API爬出天气预报信息

    天气预报网址:https://id.heweather.com/,这个网站是需要注册获取一个个人认证后台密钥key的,并且每个人都有访问次数的限制,这个key就是访问API的钥匙. 这个key现在是要 ...

  7. 3676: [Apio2014]回文串 求回文串长度与出现次数的最大值

    「BZOJ3676」[Apio2014] 回文串   Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所 ...

  8. java中常用的数据结构--Map

    一.定义: 将键映射到值的对象. 地图不能包含重复的键; 每个键可以映射到最多一个值. public interface Map<K,V> 请注意!!!, Map 没有继承 Collect ...

  9. 8核AMD Zen加持:微软Surface这回血拼

    微软定于10月2日在纽约举办Surface新品发布会,几乎全线消费级产品都将更新,比如15英寸Surface Laptop 3. 最新爆料称,15寸Surface Laptop 3预计一口气推出6款型 ...

  10. 第1节 kafka消息队列:11、kafka的数据不丢失机制,以及kafka-manager监控工具的使用;12、课程总结

    12.kafka如何保证数据的不丢失 12.1生产者如何保证数据的不丢失 kafka的ack机制:在kafka发送数据的时候,每次发送消息都会有一个确认反馈机制,确保消息正常的能够被收到 如果是同步模 ...