1、首先是Linux要支持汉字字符集:一般UTF-8。CentOS在etc/sysconfig/i18n中,Suse Enterprises Linux在 /etc/sysconfig/language中。
把LANG改成支持UTF-8的字符集
如:
LANG=”zh_CN.utf8″或者LANG=”en_US.utf8″
查看服务器字符集1、查看当前服务器字符集  #locale ,查看服务器支持的字符集  #locale -a。
让设置的字符集生效:source 文件名,另也可在 /etc/profile (全局) 或者 ~/.bashrc (单个用户)设置 Linux 系统的环境变量。
2、再当然就是在SecureCRT下功夫;菜单下有:选项->会话选项->外观->字符编码:选择UTF-8
到这里的时候发现我的汉字还是乱码:字体选择支持汉语的字体。选择好字符集就搞定了!
Eof
实战开始,CentOS和Suse Enterprises Linux下的实际操作如下:
一:检查系统是否支持上文说的两种字体:
locale -a|grep zh_CN.utf8
zh_CN.utf8
或者:
locale -a|grep en_US.utf8
en_US.utf8  两种都支持,选一种即可。
二:设定如下:
(1)CentOS:
vi /etc/sysconfig/i18n
#LANG="en_US.UTF-8"
LANG="zh_CN.utf8"
以上设定:LANG就全部变成了:zh_CN.utf8
再:source /etc/sysconfig/i18n
(2)Suse Enterprises,而这个得两个变量,如下:
vi  /etc/sysconfig/language
LC_ALL=zh_CN.utf8
LANG=zh_CN.utf8
export LC_ALL LANG
source  /etc/sysconfig/language
(3)查看两个系统的配置是否生效,以下说明都生效了。
root@116.255.139.240:/home/jackxiang/download# locale
LANG=zh_CN.utf8
LC_CTYPE="zh_CN.utf8"
LC_NUMERIC="zh_CN.utf8"
LC_TIME="zh_CN.utf8"
LC_COLLATE="zh_CN.utf8"
LC_MONETARY="zh_CN.utf8"
LC_MESSAGES="zh_CN.utf8"
LC_PAPER="zh_CN.utf8"
LC_NAME="zh_CN.utf8"
LC_ADDRESS="zh_CN.utf8"
LC_TELEPHONE="zh_CN.utf8"
LC_MEASUREMENT="zh_CN.utf8"
LC_IDENTIFICATION="zh_CN.utf8"
LC_ALL=zh_CN.utf8

WEB_39_74_sles10sp1:/home/jackxiang/download # locale
LANG=zh_CN.utf8
LC_CTYPE="zh_CN.utf8"
LC_NUMERIC="zh_CN.utf8"
LC_TIME="zh_CN.utf8"
LC_COLLATE="zh_CN.utf8"
LC_MONETARY="zh_CN.utf8"
LC_MESSAGES="zh_CN.utf8"
LC_PAPER="zh_CN.utf8"
LC_NAME="zh_CN.utf8"
LC_ADDRESS="zh_CN.utf8"
LC_TELEPHONE="zh_CN.utf8"
LC_MEASUREMENT="zh_CN.utf8"
LC_IDENTIFICATION="zh_CN.utf8"
LC_ALL=zh_CN.utf8
最后,看中文显示是否正常:(输入中文是否正常,删除中文是否一次可以删除一个中文,用vim是否可以输入中文,查看是否正常,及下载后Windows下是否正常显示)
root@116.255.139.240:/home/jackxiang/download# ls 审批流程SQL.txt
审批流程SQL.txt
...
27 update t_process set f_Status = 'error' where f_Id = 181
28 jack=向东阳  (中文输入正常,删除也正常)
下载后打开是否正常:
root@116.255.139.240:/home/jackxiang/download# sz 审批流程SQL.txt
editplus打开:jack=向东阳 正常。
本文件是Utf8,别存为ANSI后,再rz上去测试看显示及修改是否正常:
CentOS正常显示:jack=向东阳 正常
vim显示版本 7.0.237 :set fileencoding
fileencoding=euc-cn 显示正常,而Suse EnterPrise下Vim 版本   6.4.6  显示不正常:jack=Ïò¶«Ñô Õý³£
set fileencoding 为:
fileencoding=latin1
很显然是由于vim的默认配置有些问题,可能你也需要做下配置修改,如下:
vi ~/.vimrc
加入或者修改:

再用vim查看时:jack=向东阳 正常显示。删除也是一次删除一个中文,添加一个中文,sz下来后查看:
jack=向东阳 正常吗?
其实这个新宋体的字体也可以换的,我换成了:Yahei Mono ,网上下的,也不不错,中文也没有问题。
说明都是OK的,回顾一下,系统编码,vim编辑器编码,以及SecureCRT的编码,
如果再来个Mysql呢?Utf8的还好这样就Ok了(character_set_database    utf8),我们设置的都是Utf8,但是要是GBK的编码呢?怎么办呢?晕了吧,如下:
show variables like 'char%';
mysql> show variables like 'char%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | latin1                                 |
| character_set_connection | latin1                                 |
| character_set_database   | latin1                                 |
| character_set_filesystem | binary                                 |
| character_set_results    | latin1                                 |
| character_set_server     | latin1                                 |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+
这种情况的话一看就是Mysql的默认编码latin1,这各情况得确保连接参数(就是你的SecureCRT)与这个字段字符集一致。
尽管可以用 set names 'charsetname' 来改变设置,比如, set names 'gbk';
这条命令会同时修改 character_set_client,character_set_connection,character_set_results
例如:SecureCRT设置的字符编码为 UTF-8,则需要用 set names 'utf8';才能保证SecureCRT既能显示中文,也可以使用带有中文的SQL命令。
话这样说,在实际中,还真有GBK的默认,这下就不好搞了,你再怎么设置也无济于事,所以这种情况得开两个secureCRT,一个兼容utf8,一个兼容GBK。
这块涉及到中文查询,返回,多个字符集的转化,还涉及到系统SecureCRT等的转化,淘宝DBA团队前好像写过一篇文章,也收录了,当时看明白了,但忘记了:http://jackxiang.com/post/1387/,呵呵,这块好像还是有点薄弱,希望有能统一的兄弟给研究一下,谢谢。
但是,这样还是会乱码,得修改SecureCRT的编码为默认:再当然就是在SecureCRT下功夫;菜单下有:选项->会话选项->外观->字符编码:选择默认。
mysql> select * from t_project \G; 中文正常了,ProjectName: 临时产品 ...
中文查询:
mysql> select * from t_project where ProjectName='项目234'\G;
*************************** 1. row ***************************
             f_Id: 72
ProjectName: 项目234
查询Ok,应该插入也不成问题。。。EOF




后记摘抄自同事的说法:
使用mysql好久了,经常被中文乱码搞的很郁闷,在经历了N久的折磨后,现将解决乱码的流程共享出来:
1.首先要确认连接数据库的字符集是否一致。
2.查询前,要确认与表的字符集一致。
3.如果表里面的字符集确实不对应,尝试使用CONVERT()函数
4.检查你的页面编码、meta 声明、数据库连接方式(SET NAMES)是否一致,如果你的页面和meta设置为gb2312,但是却在程序中设置 SET NAMES utf8,同样会导致乱码。原因是如果页面设置为 gb2312 ,那么表单中的数据也是按照 gb2312 提交,但是程序却要求按照 utf8 去处理,结果自然是乱码。
5.检查你的文件存储编码是否和 meta 声明的一致,假如你的文件是按照 utf-8 编码存储,但是 meta 却声明为 gb2312 ,将导致乱码。
确认以上三点,基本上可以解决90%的乱码问题。
Tags: , , ,
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]