现在的位置: 首页 > 综合 > 正文

字符集与中文的问题的详细说明

2013年08月14日 ⁄ 综合 ⁄ 共 2044字 ⁄ 字号 评论关闭

导读:

  字符集与中文的问题的详细说明

  论坛中有不少帖子是关于字符集与中文的问题,仔细看了下,讲解的都不甚详细,本人学习MySQL亦仅数日,在此将本人看书心得略表一二,望起抛砖引玉之效。

  ================================

  关于中文问题实际上并没有什么复杂的,请注意如下2个细节:

  1)只要是gb2312,gbk,utf8等支持多字节编码的字符集都可以储存汉字,当然,gb2312中的汉字数量远少于gbk,而gb2312,gbk等都可在utf8下编码。因此,要想数据表中能储存中文只需数据表的字符集按需任选一种可存储汉字的既可。

  在建立数据表时,若数据库的字符集不支持中文集则在create table 后面加上 character set gb2312/gbk/utf8 任选其一既可,否则新建的表会自动采用与数据库相同的字符集的。

  MySQL还有一个很棒的地方,可以为列指定字符集,hoho~~我喜欢

  总之,用show create table table_name; 查看确保你的数据表的字符集支持中文存储既可

  2)至于前台显示、输入中文的问题,由于本人不会php等(所以也不用客户端软件),因此仅就cmd下的client为例作说明,想来在其他客户端也应是如此配置吧,有不对的地方望指教,有遗漏的望大家补充。

  很多帖子中说,需要client的字符集与服务器端字符集、数据库字符集等一致,其实无须这么复杂。

  在任何的字符集状态下,我们都可以对可存储中文的数据表插入中文,只需要在所要插入的中文前添加一个introducer表明我要对此中文的编码方式既可,请看:

  insertinto table_name (column_with_chinese) values( _gbk '我要插入的中文');

  这个命令中的_gbk即是一个"character set introducer",它表明后面的 '我要插入的中文'将采用gbk编码。请大家注意introducer和函数convert()的区别,这个,留给大家自己查阅资料。

  这样,无论在任何字符集下,都可以保证正确无误的插入中文,或者是其他任何字符集的文字。

  说到这里,可能大家觉得太烦了,每次都要加一个introducer,那么我们再来看看mysql的设置,看看怎么简化它。

  用命令show variables like 'character/_set/_%';查看当前字符集设定:

  +--------------------------+--------+

  | Variable_name | Value |

  +--------------------------+--------+

  | character_set_client | latin1 |

  | character_set_connection | latin1 |

  | character_set_database | utf8 |

  | character_set_filesystem | binary |

  | character_set_results | latin1 |

  | character_set_server | utf8 |

  | character_set_system | utf8 |

  +--------------------------+--------+

  (我这里为了演示故意设置成latin1这种不支持多字节的字符集)

  很多人会遇到的错误:Data too long forcolumn 'XXX' at row 1

,其产生的原因在于character_set_connection的字符集设置,如果我们用了introducer,那么该参数无视;若将此参数改为与数据表中文编码方式相同,如gbk,则我们可省略掉introducer的书写,传递到服务端的字符串将自动以该字符集进行编码。

  此时,我们用select命令来查看数据表数据,却发现会出现乱码现象,因此,请大家注意character_set_results这个参数,他表示的是服务器段返回给客户端的结果集所采用的字符集,因此,仅需将此设置成gbk:set character_set_results = gbk; 那么我们就可以正常的查看数据表内的中文内容了。

  由此可见出现中文问题最关键的两个参数就是以上这两个,有些则其他参数的含义留给各位自行查阅资料。

  若大家觉得单独设置字符集太繁琐,那么最简单的工作就是用set names charset_name;一次性设置客户端的所有字符集,这下可就可以偷懒了。

  ==============================

  不过仍需注意的是,若我们同时处理几个不同字符集的内容,那么,呵呵,introducer还是不可少的阿!

本文转自

http://bbs.mysql.cn/viewthread.php?tid=922&extra=&authorid=0&page=1

抱歉!评论已关闭.