深入Mysql字符集设置

基本概念

• 字符(Character)是指人类语言中最小的表义符号。例如’A’、’B’等;

• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符’A’赋予数值0,给字符’B’赋予数值1,则0就是字符’A’的编码;

• 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)。例如,给定字符列表为{’A’,’B’}时,{’A’=>0, ‘B’=>1}就是一个字符集;

• 字符序(Collation)是指在同一字符集内字符之间的比较规则;

• 确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系;

• 每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序(Default Collation);

• MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的;

 

MySQL字符集设置

• 系统变量:

– character_set_server:默认的内部操作字符集

– character_set_client:客户端来源数据使用的字符集

– character_set_connection:连接层字符集

– character_set_results:查询结果字符集

– character_set_database:当前选中数据库的默认字符集

– character_set_system:系统元数据(字段名等)字符集

– 还有以collation_开头的同上面对应的变量,用来描述字符序。

• 用introducer指定文本字符串的字符集:

– 格式为:[_charset] ’string’ [COLLATE collation]

– 例如:

• SELECT _latin1 ’string’;

• SELECT _utf8 ‘你好’ COLLATE utf8_general_ci;

– 由introducer修饰的文本字符串在请求过程中不经过多余的转码,直接转换为内部字符集处理。

MySQL中的字符集转换过程

1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;

2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:

• 使用每个数据字段的CHARACTER SET设定值;

• 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准);

• 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;

• 若上述值不存在,则使用character_set_server设定值。

3. 将操作结果从内部操作字符集转换为character_set_results。

图片1

常见问题解析

• 向默认字符集为utf8的数据表插入utf8编码的数据前没有设置连接字符集,查询时设置连接字符集为utf8

– 插入时根据MySQL服务器的默认设置,character_set_client、character_set_connection和character_set_results均为latin1;

– 插入操作的数据将经过latin1=>latin1=>utf8的字符集转换过程,这一过程中每个插入的汉字都会从原始的3个字节变成6个字节保存;

– 查询时的结果将经过utf8=>utf8的字符集转换过程,将保存的6个字节原封不动返回,产生乱码……

图片2

• 向默认字符集为latin1的数据表插入utf8编码的数据前设置了连接字符集为utf8

– 插入时根据连接字符集设置,character_set_client、character_set_connection和character_set_results均为utf8;

– 插入数据将经过utf8=>utf8=>latin1的字符集转换,若原始数据中含有\u0000~\u00ff范围以外的Unicode字 符,会因为无法在latin1字符集中表示而被转换为“?”(0×3F)符号,以后查询时不管连接字符集设置如何都无法恢复其内容了。

图片3

检测字符集问题的一些手段

• SHOW CHARACTER SET;

• SHOW COLLATION;

• SHOW VARIABLES LIKE ‘character%’;

• SHOW VARIABLES LIKE ‘collation%’;

• SQL函数HEX、LENGTH、CHAR_LENGTH

• SQL函数CHARSET、COLLATION

使用MySQL字符集时的建议

• 建立数据库/表和进行数据库操作时尽量显式指出使用的字符集,而不是依赖于MySQL的默认设置,否则MySQL升级时可能带来很大困扰;

• 数据库和连接字符集都使用latin1时虽然大部分情况下都可以解决乱码问题,但缺点是无法以字符为单位来进行SQL操作,一般情况下将数据库和连接字符集都置为utf8是较好的选择;

• 使用mysql C API时,初始化数据库句柄后马上用mysql_options设定MYSQL_SET_CHARSET_NAME属性为utf8,这样就不用显式地用 SET NAMES语句指定连接字符集,且用mysql_ping重连断开的长连接时也会把连接字符集重置为utf8;

• 对于mysql PHP API,一般页面级的PHP程序总运行时间较短,在连接到数据库以后显式用SET NAMES语句设置一次连接字符集即可;但当使用长连接时,请注意保持连接通畅并在断开重连后用SET NAMES语句显式重置连接字符集。

其他注意事项

• my.cnf中的default_character_set设置只影响mysql命令连接服务器时的连接字符集,不会对使用libmysqlclient库的应用程序产生任何作用!

• 对字段进行的SQL函数操作通常都是以内部操作字符集进行的,不受连接字符集设置的影响。

• SQL语句中的裸字符串会受到连接字符集或introducer设置的影响,对于比较之类的操作可能产生完全不同的结果,需要小心!

META标签:HTTP标题信息(HTTP-EQUIV)和页面描述信息(NAME)

HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显示网页内容。常用的HTTP-EQUIV类型有:

1、Content-Type和Content-Language (显示字符集的设定)

说明:设定页面使用的字符集,用以说明主页制作所使用的文字已经语言,浏览器会根据此来调用相应的字符集显示page内容。

用法:<Meta http-equiv="Content-Type" Content="text/html; Charset=gb2312">

<Meta http-equiv="Content-Language" Content="zh-CN">

注意:该META标签定义了HTML页面所使用的字符集为GB2132,就是国标汉字码。如果将其中的“charset=GB2312”替换成“BIG5”,则该页面所用的字符集就是繁体中文Big5码。当你浏览一些国外的站点时,IE浏览器会提示你要正确显示该页面需要下载xx语支持。这个功能就是通过读取HTML页面META标签的Content-Type属性而得知需要使用哪种字符集显示该页面的。如果系统里没有装相应的字符集,则IE就提示下载。其他的语言也对应不同的charset,比如日文的字符集是“iso-2022-jp ”,韩文的是“ks_c_5601”。

Content-Type的Content还可以是:text/xml等文档类型;

Charset选项:ISO-8859-1(英文)、BIG5、UTF-8、SHIFT-Jis、Euc、Koi8-2、us-ascii, x-mac-roman, iso-8859-2, x-mac-ce, iso-2022-jp, x-sjis, x-euc-jp,euc-kr, iso-2022-kr, gb2312, gb_2312-80, x-euc-tw, x-cns11643-1,x-cns11643-2等字符集;Content-Language的Content还可以是:EN、FR等语言代码。

2、Refresh (刷新)

说明:让网页多长时间(秒)刷新自己,或在多长时间后让网页自动链接到其它网页。

用法:<Meta http-equiv="Refresh" Content="30">

<Meta http-equiv="Refresh" Content="5; Url=http://www.downme.com">

注意:其中的5是指停留5秒钟后自动刷新到URL网址。

3、Expires (期限)

说明:指定网页在缓存中的过期时间,一旦网页过期,必须到服务器上重新调阅。

用法:<Meta http-equiv="Expires" Content="0">

<Meta http-equiv="Expires" Content="Wed, 26 Feb 1997 08:21:57 GMT">

注意:必须使用GMT的时间格式,或直接设为0(数字表示多少时间后过期)。

4、Pragma (cach模式)

说明:禁止浏览器从本地机的缓存中调阅页面内容。

用法:<Meta http-equiv="Pragma" Content="No-cach">

注意:网页不保存在缓存中,每次访问都刷新页面。这样设定,访问者将无法脱机浏览。

5、Set-Cookie (cookie设定)

说明:浏览器访问某个页面时会将它存在缓存中,下次再次访问时就可从缓存中读取,以提高速度。当你希望访问者每次都刷新你广告的图标,或每次都刷新你的计数器,就要禁用缓存了。通常HTML文件没有必要禁用缓存,对于ASP等页面,就可以使用禁用缓存,因为每次看到的页面都是在服务器动态生成的,缓存就失去意义。如果网页过期,那么存盘的cookie将被删除。

用法:<Meta http-equiv="Set-Cookie" Content="cookievalue=xxx; expires=Wednesday,

21-Oct-98 16:14:21 GMT; path=/">

注意:必须使用GMT的时间格式。

6、Window-target (显示窗口的设定)

说明:强制页面在当前窗口以独立页面显示。

用法:<Meta http-equiv="Widow-target" Content="_top">

注意:这个属性是用来防止别人在框架里调用你的页面。Content选项:_blank、_top、_self、_parent。

7、Pics-label (网页RSAC等级评定)

说明:在IE的Internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级

别就是通过该参数来设置的。

用法:<META http-equiv="Pics-label" Contect=

"(PICS-1.1'http://www.rsac.org/ratingsv01.html'

I gen comment 'RSACi North America Sever' by 'inet@microsoft.com'

for 'http://www.microsoft.com' on '1997.06.30T14:21-0500' r(n0 s0 v0 l0))">

注意:不要将级别设置的太高。RSAC的评估系统提供了一种用来评价Web站点内容的标准。用户可以设置Microsoft Internet Explorer(IE3.0以上)来排除包含有色情和暴力内容的站点。上面这个例子中的HTML取自Microsoft的主页。代码中的(n 0 s 0 v 0 l 0)表示该站点不包含不健康内容。级别的评定是由RSAC,即美国娱乐委员会的评级机构评定的,如果你想进一步了解RSAC评估系统的等级内容,或者你需要评价自己的网站,可以访问RSAC的站点:http://www.rsac.org/

8、Page-Enter、Page-Exit (进入与退出)

说明:这个是页面被载入和调出时的一些特效。

用法:<Meta http-equiv="Page-Enter" Content="blendTrans(Duration=0.5)">

<Meta http-equiv="Page-Exit" Content="blendTrans(Duration=0.5)">

注意:blendTrans是动态滤镜的一种,产生渐隐效果。另一种动态滤镜RevealTrans也可以用于页面进入与退出效果:

<Meta http-equiv="Page-Enter" Content="revealTrans(duration=x, transition=y)">

<Meta http-equiv="Page-Exit" Content="revealTrans(duration=x, transition=y)">

Duration表示滤镜特效的持续时间(单位:秒)

Transition滤镜类型。表示使用哪种特效,取值为0-23。

0 矩形缩小

1 矩形扩大

2 圆形缩小

3 圆形扩大

4 下到上刷新

5 上到下刷新

6 左到右刷新

7 右到左刷新

8 竖百叶窗

9 横百叶窗

10 错位横百叶窗

11 错位竖百叶窗

12 点扩散

13 左右到中间刷新

14 中间到左右刷新

15 中间到上下

16 上下到中间

17 右下到左上

18 右上到左下

19 左上到右下

20 左下到右上

21 横条

22 竖条

23 以上22种随机选择一种

9、MSThemeCompatible (XP主题)

说明:是否在IE中关闭 xp 的主题

用法:<Meta http-equiv="MSThemeCompatible" Content="Yes">

注意:关闭 xp 的蓝色立体按钮系统显示样式,从而和win2k 很象。

10、IE6 (页面生成器)

说明:页面生成器generator,是ie6

用法:<Meta http-equiv="IE6" Content="Generator">

注意:用什么东西做的,类似商品出厂厂商。

11、Content-scrīpt-Type (脚本相关)

说明:这是近来W3C的规范,指明页面中脚本的类型。

用法:<Meta http-equiv="Content-scrīpt-Type" Content="text/javascrīpt">

注意:

★NAME变量

name是描述网页的,对应于Content(网页内容),以便于搜索引擎机器人查找、分类(目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。

name的value值(name="")指定所提供信息的类型。有些值是已经定义好的。例如descrīption(说明)、keyword(关键字)、refresh(刷新)等。还可以指定其他任意值,如:creationdate(创建日期) 、

document ID(文档编号)和level(等级)等。

name的content指定实际内容。如:如果指定level(等级)为value(值),则Content可能是beginner(初级)、intermediate(中级)、advanced(高级)。

1、Keywords (关键字)

说明:为搜索引擎提供的关键字列表

用法:<Meta name="Keywords" Content="关键词1,关键词2,关键词3,关键词4,……">

注意:各关键词间用英文逗号“,”隔开。META的通常用处是指定搜索引擎用来提高搜索质量的关键词。当数个META元素提供文档语言从属信息时,搜索引擎会使用lang特性来过滤并通过用户的语言优先参照来显示搜索结果。例如:

<Meta name="Kyewords" Lang="EN" Content="vacation,greece,sunshine">

<Meta name="Kyewords" Lang="FR" Content="vacances,grè:ce,soleil">

2、Descrīption (简介)

说明:Descrīption用来告诉搜索引擎你的网站主要内容。

用法:<Meta name="Descrīption" Content="你网页的简述">

注意:

3、Robots (机器人向导)

说明:Robots用来告诉搜索机器人哪些页面需要索引,哪些页面不需要索引。Content的参数有all、none、index、noindex、follow、nofollow。默认是all。

用法:<Meta name="Robots" Content="All|None|Index|Noindex|Follow|Nofollow">

注意:许多搜索引擎都通过放出robot/spider搜索来登录网站,这些robot/spider就要用到meta元素的一些特性来决定怎样登录。

all:文件将被检索,且页面上的链接可以被查询;

none:文件将不被检索,且页面上的链接不可以被查询;(和 "noindex, no follow" 起相同作用)

index:文件将被检索;(让robot/spider登录)

follow:页面上的链接可以被查询;

noindex:文件将不被检索,但页面上的链接可以被查询;(不让robot/spider登录)

nofollow:文件将不被检索,页面上的链接可以被查询。(不让robot/spider顺着此页的连接往下探找)

4、Author (作者)

说明:标注网页的作者或制作组

用法:<Meta name="Author" Content="张三,abc@163.com">

注意:Content可以是:你或你的制作组的名字,或Email

5、Copyright (版权)

说明:标注版权

用法:<Meta name="Copyright" Content="本页版权归网易学院所有。All Rights Reserved">

注意:

6、Generator (编辑器)

说明:编辑器的说明

用法:<Meta name="Generator" Content="PCDATA|FrontPage|">

注意:Content="你所用编辑器"

7、revisit-after (重访)

说明:

用法:<META name="revisit-after" CONTENT="7 days" >

注意:

★Head中的其它一些用法

1、scheme (方案)

说明:scheme can be used when name is used to specify how the value of content should be interpreted.

用法:<meta scheme="ISBN" name="identifier" content="0-14-043205-1" />

注意:

2、Link (链接)

说明:链接到文件

用法:<Link href="soim.ico" rel="Shortcut Icon">

注意:很多网站如果你把她保存在收件夹中后,会发现它连带着一个小图标,如果再次点击进入之后还会发现地址栏中也有个小图标。现在只要在你的页头加上这段话,就能轻松实现这一功能。<LINK> 用来将目前文件与其它 URL 作连结,但不会有连结按钮,用於 <HEAD> 标记间, 格式如下:

<link href="URL" rel="relationship">

<link href="URL" rev="relationship">

3、Base (基链接)

说明:插入网页基链接属性

用法:<Base href="http://www.***.net/" target="_blank">

注意:你网页上的所有相对路径在链接时都将在前面加上“http://www.***.com/”。其中target="_blank"是链接文件在新的窗口中打开,你可以做其他设置。将“_blank”改为“_parent”是链接文件将在当前窗口的父级窗口中打开;改为“_self”链接文件在当前窗口(帧)中打开;改为“_top”链接文件全屏显示。

以上是META标签的一些基本用法,其中最重要的就是:Keywords和Descrīption的设定。为什么呢?道理很简单,这两个语句可以让搜索引擎能准确的发现你,吸引更多的人访问你的站点!根据现在流行搜索引擎(Google,Lycos,AltaVista等)的工作原理,搜索引擎先派机器人自动在WWW上搜索,当发现新的网站时,便于检索页面中的Keywords和Descrīption,并将其加入到自己的数据库,然后再根据关键词的密度将网站排序。

由此看来,我们必须记住添加Keywords和Descrīption的META标签,并尽可能写好关键字和简介。否则,

后果就会是:

●如果你的页面中根本没有Keywords和Descrīption的META标签,那么机器人是无法将你的站点加入数

据库,网友也就不可能搜索到你的站点。

●如果你的关键字选的不好,关键字的密度不高,被排列在几十甚至几百万个站点的后面被点击的可

能性也是非常小的。

写好Keywords(关键字)要注意以下几点:

●不要用常见词汇。例如www、homepage、net、web等。

●不要用形容词,副词。例如最好的,最大的等。

●不要用笼统的词汇,要尽量精确。例如“爱立信手机”,改用“T28SC”会更好。

“三人之行,必有我师”,寻找合适关键词的技巧是:到Google、Lycos、Alta等著名搜索引擎,搜索与

你的网站内容相仿的网站,查看排名前十位的网站的META关键字,将它们用在你的网站上,效果可想而知了。

★小窍门

为了提高搜索点击率,这里还有一些“捷径”可以帮得到你:

●为了增加关键词的密度,将关键字隐藏在页面里(将文字颜色定义成与背景颜色一样)。

●在图像的ALT注释语句中加入关键字。如:<IMG SRC="xxx.gif" Alt="Keywords">

●利用HTML的注释语句,在页面代码里加入大量关键字。用法: <!-- 这里插入关键字 -->