成都网站建设
|
域名注册
|
虚拟主机
|
网站制作
|
网站案例
|
网站优化
|
网站推广
|
企业邮局
|
服务器租用
|
广告设计
首页
服务器租用
企业邮箱
虚拟主机
网站程序
营销推广
网站建设
域名注册
前端开发
网站备案
网站空间
|
独立ip空间
|
双线主机
|
php虚拟主机
|
免备案空间
|
香港空间
|
云空间
|
vps主机
|
服务器租用
|
服务器托管
|
云服务器
|
jsp空间
|
网站空间报价
虚拟主机
主机管理
主机购买
数据库
主机续费升级
FTP上传
服务器租用
web服务器
FTP服务器
服务器托管
服务器租用
vps主机服务器
企业邮箱
企业邮箱优势
企业邮箱设置
邮箱收发问题
邮箱功能讲解
邮箱其他问题
网站程序
java教程
asp程序
asp.net程序
vb编程
php程序
营销推广
seo优化
网站推广
搜索引擎
免费资源
网站建设
网站方案
网站改版
网页设计
网站维护
网站策划
域名注册
域名转入\转出
英文域名
通用网址
中文域名
域名解析
前端开发
html
jQuery
JavaScript教程
css
div+css
网站备案
备案流程指南
备案资料下载
备案常见问题
各省备案要求
移动互联网
wap手机网站
app应用开发
微网站
当前位置:
创新互联
>>
常见问题
>>
虚拟主机
>>
数据库
>>
关于MySQL字符集架构的思考
关于MySQL字符集架构的思考
作者:创新互联 文章来源:虚拟主机 点击数:
更新时间:2013-04-21
最近几个月,我每次用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。操作”/w片 /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一样不安全。
Navicat for MySQL与MySQL GUI Tools功能比较
:上一篇
MySQL出错代码含义列表解释一表通
:下一篇
数据库相关文章
sql2012无法更改设计数据库...
Navicat for MySQ...
利用MySQL内置函数实现全文搜...
ASP.NET网站发布时如何带上...
MSSQL使用说明
MYSQL使用帮助
MSSQL和MYSQL有什么区别...
如何限制Mssql数据库占用最大...
创新互联专注虚拟主机/网站空间多年,高速、稳定、安全有保障!虚拟主机首选创新互联。
移动互联网
|
网站备案
|
前端开发
|
域名注册
|
网站建设
|
营销推广
|
网站程序
|
虚拟主机
|
企业邮箱
|
服务器租用
|
热门搜索
服务电话:028-86922220 13518219792 公司地址:成都市太升南路288号锦天国际A幢10楼2号
企业邮箱:
service@cdxwcx.com
版权所有:成都创新互联科技有限公司 蜀ICP备09010846号
成都网站建设
MySQL MySQL字符集架构