关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » MySQL »关于MySQL字符集架构的思考

    关于MySQL字符集架构的思考

    2011-03-31 16:22:00 出处:ITJS
    分享

    导读:随着各种多字节字符集的广泛应用,而在软件开发里人数比例非常高的操英文的程序员对多字节字符并不是很了解,这是日前几年很多漏洞都是多字节引起的一个原因。该篇文章作者就MySQL的字符集架构作用谈了自己的看法。MySQL现在如此层次分明的字符集架构作用真的很大吗

    MySQL的字符集处理

    发送请求

    客户端(character_set_client)=》数据库连接(character_set_connection)=》存储(table,column)

    返回请求

    存储(table,column)=》数据库连接(character_set_connection )=》客户端(character_set_results)

    在每一个非初始节点,都会做一次从上一个结点到当前节点的字符集转换操作。举个例子,有如下环境:

    character_set_connection utf-8 character_set_results gbk character_set_client gb2312 有表A,字段字符集全部为BIG5

    发送请求的时候,首先数据从gbk转换为utf-8,再转换为BIG5,然后再存储。

    返回请求的时候,首先数据从BIG5转换为utf-8,再转换为gb2312,然后再发送给客户端。

    架构的作用

    1. 允许不同的客户端具有不同的字符集。典型的例子就是,我有一个utf-8的站点,这个站点就是一个charset client为utf-8的客户端。与此同时,我有可能需要在一个gbk的终端上读写数据库,这又是一个客户端,不过它的字符集是gbk。

    2. 通过数据库操作文件系统的时候,需要把文件路径转为文件系统的字符集。例如我的客户端是gbk,而服务器文件系统是utf-8。操作”/A片 /Rina.rmvb”,发送过去的数据里,“片”的数据和服务器是不一样的。这时候就需要有个办法可以把转换GBK的“片”到utf-8。在这里 MySQL引入了一个叫character_filesystem的东西来完成这个事情。

    除此之外,我暂时想不到其他的作用了。但是仔细想想,我们真的需要这样的处理吗 很多网站,无非就是希望自己的数据能怎么进去就怎么出来。这里又有两种情况了。

    1. 希望可以根据数据进行排序或者做like操作。首先说排序,对于包含中文的字段来说,根据字符集排序的概念如同鸡肋。简体中文排序,一般都是希望按拼音来排序。我没有去真正了解过MySQL里的校验,但是从我接触过的程序来看,需要做此类排序,都是专门建一个存放拼音的字段来排序。而拼音又存在多音字的情况。如果是UTF-8,还存在某个区间的中文同时被中日韩三国共用的情况。实现起来不是这么容易,所以MySQL无论的GBK还是UTF-8的校验集 应该都没有实现拼音。我敢说,现在国内使用MySQL的大多数网站,所用到的校验集,只是一个byte排序而已。而byte排序,根本不需要使用什么字符 集。所以说对于中文站点,MySQL字符校验在排序上没任何意义。

    但是在like操作上,倒是有了一点点意义。例如我like ‘%a%’,就有可能匹配到某个中文某个部分含有a。当然这种情况在utf-8下不会遇到,因为utf-8的存储格式导致a只可能是a,不可能是一个多字节字符的一部分。但是在其他字符集可能就会有这个问题了。说到最后,like又变得和order一样使得校验没意义了。

    2. 如果完全不需要对数据进行排序,like或者全文检索,那么请停止使用char,varchar,text之类的吧。 binary,varbinary,BLOB才是正确的选择。binary之类的在存储,取出的时候都不会进行字符集转换,而在排序时候,只根据二进制内 容排序,所以在效率上高出char,varchar,text很多。

    这种情况更不需要字符集了。但是按照目前MySQL的架构,在client和connection之间的字符集操作,是忽略字段类型的,在这两个节点之间,依然会进行字符集转换。

    另外提一下PHP里的设置字符集。大家请不要再使用mysql_query(”set names utf8″)这样的语句了。mysql_set_charset()才是最完整的字符集设置方式。后者比前者多一个设置,就是把struct MySQL的charset成员也设置了。这个成员变量在escape的时候起着很重要的作用,特别是对于GBK这种运行把“”作为字符一部分的编码格式。如果你只使用mysql_query(”set names XXX”),那么在某些字符集,会有重大的安全漏洞,导致mysql_real_escape_string变得和addslashes一样不安全。

    计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。关于MySQL字符集架构的思考就为大家介绍到这,希望文中涉及到的内容对大家能够有所帮助。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    Cornell大神Kleinberg的经典教材《算法设计》是最好入门的算法教材

    从 Microsoft 下载中心安装 Windows 7 SP1 和 Windows Server 2008 R2 SP1 之前要执行的步骤

    Llama 2基于UCloud UK8S的创新应用

    火山引擎DataTester:如何使用A/B测试优化全域营销效果

    腾讯云、移动云继阿里云降价后宣布大幅度降价

    字节跳动数据平台论文被ICDE2023国际顶会收录,将通过火山引擎开放相关成果

    这个话题被围观超10000次,火山引擎VeDI如此解答

    误删库怎么办?火山引擎DataLeap“3招”守护数据安全

    IT头条

    平替CUDA!摩尔线程发布MUSA 4性能分析工具

    00:43

    三起案件揭开侵犯个人信息犯罪的黑灰产业链

    13:59

    百度三年开放2.1万实习岗,全力培育AI领域未来领袖

    00:36

    工信部:一季度,电信业务总量同比增长7.7%,业务收入累计完成4469亿元

    23:42

    Gartner:2024年全球半导体营收6559亿美元,AI助力英伟达首登榜首

    18:04

    技术热点

    iOS 8 中如何集成 Touch ID 功能

    windows7系统中鼠标滑轮键(中键)的快捷应用

    MySQL数据库的23个特别注意的安全事项

    Kruskal 最小生成树算法

    Ubuntu 14.10上安装新的字体图文教程

    Ubuntu14更新后无法进入系统卡在光标界面解怎么办?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。