51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1405|回复: 0
打印 上一主题 下一主题

MySQL 字符集和校对

[复制链接]
  • TA的每日心情
    无聊
    2024-7-12 13:16
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2019-2-2 10:32:25 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    字符集是指一种从二进制编码到某类字符符号的映射,校对是一组用于某个字符集的排序规则。每一类编码字符都有其对应的字符集和校对规则
    MySQL 如何使用字符集
    每种字符集都可能有多种校对规则,并且都有一个默认的校对规则。每个校对规则都是针对某个特定的字符集的,和其他的字符集都没有关系。校对规则和字符集总是一起使用的,我们也将这样的组合统称为一个字符集。
    MySQL的设置可以分为两类:创建对象时的默认值在服务器和客户端通信时的设置
    创建对象时的默认值
    MySQL服务器有默认的字符集和校对规则,每个数据库、数据表也有自己的默认值。这是一个逐层继承的默认设置,最终最靠底层的默认设置将影响我们创建的对象。这些默认值,从上而下地告诉MySQL应该使用什么字符集来存储某个列。
    在这个阶梯的每一层,你都可以指定一个特定的字符集或者让服务器使用它的默认值:
    • 在创建数据库的时候,将根据服务器上的 character_set_server 设置来设定该数据库的默认字符集
    • 创建表的时候,将根据数据库的字符集设置指定这个表的字符集设置
    • 创建列的时候,将根据表的设置指定列的字符集设置
    需要注意的是: 真正存放数据的是列,所以更高“阶梯”的设置只是指定默认值。一个表的默认字符集设置无法影响存储在这个表中某个列的值。只有当创建列而没有列指定字符集的时候,如果没有指定字符集,表的默认字符集才有作用。
    服务器和客户端通信时的设置
    当服务器和客户端通信的时候,他们可能使用不同的字符集。这时,服务器端将进行必要的翻译转换工作,如图所示:
    根据需要,可以使用 SET NAMES 或者 SET CHARACTER SET 语句来改变上面的设置。不过在服务器上使用这个命令只会改变服务器端的设置。客户端程序和客户端的API也需要使用正确的字符集才能避免在通信时出现问题。
    选择字符集和校对规则
    在一个数据库中使用多个不同的字符集是一件很让人头疼的事情,字符集之间不兼容问题会很难缠。有时候一切看起来很正常,但是当某个特殊字符出现的时候,所有类型的操作可能都无法进行。
    正确的方法是,最好先为服务器(或者数据库) 选择一个合理的字符集。然后根据不同的实际情况,让某些列选择合适的字符集。
    下面展示了在创建数据库、表、列的时候如何显式地指定字符集和校对规则:
    CREATE DATABASE d CHARSET latin1;CREATE TABLE d.t(    col1 CHAR(1),    col2 CHAR(1) CHARSET utf8,    col3 CHAR(1) COLLATE latin1_bin)DEFAULT CHARSET=cp1251;
    这个表最后的字符集和校对规则如下:
    [td]
    FieldTypeCollation
    col1char(1)cp1251_general_ci
    col2char(!)utf8_general_ci
    col3char(!)latin1_bin
    字符集和校对规则如何影响查询
    某些字符集和校对规则可能会需要更多的CPU操作,可能会消耗更多的内存和存储空间,甚至还会影响索引的正常操作。
    只有在排序查询要求的字符集和服务器数据的字符集相同的时候,才能使用索引进行排序。索引根据数据列的校对规则进行排序。如果希望使用别的校对规则进行排序,那么MySQL就需要使用文件排序。


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-10 13:54 , Processed in 0.060812 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表