关于mysql字符乱码早就有标准的解决办法,数据库使用UTF8编码,页面也使用UTF8编码,然后服务器端先作一次 'SET NAMES UTF8' 的查询就万事大吉。这次做一个项目对相关问题又有了深入一点的了解。
系统为 Centos4.7,PHP 4.3.9, MYSQL 4.1
一、关于mysql数据库编码设定有两种常见办法
- 建立数据时采用默认的Latin1编码,然后配置全部采用默认。这样写库是什么编码取出来就是什么编码,就是说如果页面是GB2312编码那么写入就是经过Latin1编码“pack”过的GB编码,取出来之后也是GB2312编码。这种类似RAW写库的方式不会产生乱码,不过缺点也不少。比如在导入导出时可能会乱码,缺乏兼容性如果数据库升级很可能乱码,貌似在搜索中文时会有兼容问题。
- 数据库,前后台全部采用UTF-8编码。虽然三字节编码相对浪费空间及流量但是从此大大减小不兼容性。早点时候会出现乱码问题,现在大家都知道一条sql命令就可以解决。
先转个网上搜索的
引用
此时,要是我们通过采用UTF-8的PHP程序从数据库里读取数据,很有可能是一串“?????”或者是其他乱码。网上查了半天,解决办法倒是简单,在连接数据库之后,读取数据之前,先执行一项查询“SET NAMES UTF8”,即在PHP里
mysql_query("SET NAMES UTF8");
即可显示正常(只要数据库里信息的字符正常)。为什么会这样?这句查询“SET NAMES UTF8”到底是什么作用?
到 MySQL命令行输入“SET NAMES UTF8;”,然后执行“show variebles like“character_set_%”;”,发现原来为latin1的那些变量“character_set_client”、 “character_set_connection”、“character_set_results”的值全部变为utf8了,原来是这3个变量在捣蛋。查阅手册,上面那句等于:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
看看这3个变量的作用:
信息输入路径:client→connection→server;
信息输出路径:server→connection→results。
换句话说,每个路径要经过3次改变字符集编码。以出现乱码的输出为例,server里utf8的数据,传入connection转为latin1,传入 results转为latin1,utf-8页面又把results转过来。如果两种字符集不兼容,比如latin1和utf8,转化过程就为不可逆的,破坏性的。所以就转不回来了。
但这里要声明一点,“SET NAMES UTF8”作用只是临时的,MySQL重启后就恢复默认了。
接下来就说到MySQL在服务器上的配置问题了。岂不是我们每次对数据库读写都得加上“SET NAMESUTF8”,以保证数据传输的编码一致?能不能通过配置MySQL来达到那三个变量默认就为我们要想的字符集
?手册上没说,我在网上也没找到答案。所以,从服务器配置的角度而言,是没办法省略掉那行代码的。
先回答上面引用中末尾黑体字的问题: 在服务器端配置只能对控制台命令行登录起效果,而对PHP(应该也包括JAVA/ASP)连接无效
。
至于搜索到的修改mysql配置方法也存在问题
引用
修改默认字符集
(1) 最简单的修改方法,就是修改mysql的my.ini(linux系统为my.cnf)文件中的字符集键值,
如
在[client]下面加上
default-character-set = utf8
在[mysqld]下面加上
character_set_server = utf8
default-character-set = utf8
character-set-server = utf8
collation-server = latin1_swedish_ci
init_connect = 'SET collation_connection = utf8_general_ci'
init_connect = 'SET NAMES utf8'
修改完后,重启mysql的服务,service mysql restart
我只要在my.cnf中[mysqld]小节里面添加上面“character_set_server ”的设置就会导致重启服务失败,经过测试可行的配置如下:
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
如果同时出现[mysql][client]对于default-character-set的定义,以最后出现的定义为准。
并且此字符集定义只影响控制台登录,sql管理软件(如ems/navicat)不受影响需要自己设定
这个可以这样验证:在[mysql]中随便输入一个错误定义,然后service mysqld restart时并不会报错,而是
在 #mysql -p 时报错,比如:
mysql: unknown variable 'init_connect=SET collation_connection = utf8_bin'
注意如果是[client]中定义错误则服务将无法启动。
如此配置可以对控制台登录(#mysql -p)到mysql命令行有效,所以运行 show variables like 'character%'; 这条命令可以得到如下信息:
mysql> show variables like 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | utf8_general_ci | -> 由set name utf8决定
| collation_database | latin1_swedish_ci | -> 数据库自身属性
| collation_server | latin1_swedish_ci | -> mysql系统默认定义
+----------------------+-------------------+
对于collation_database 字段若没有使用use命令选择数据库那么其值取自下一项(collation_server )。
二、上面的设置只针对控制台登录,如果使用GUI软件登录那么依据软件自身对字符集的设定
- EMS MySQL Manager 2005 v3版本不支持UTF-8编码,支持GB/GBK,2007 v4版本支持UTF-8。所以如果是采用Lation1建库RAW写库的那么v3版本使用默认数据库字符集属性就能正常显示中文,v4新版得采用windows charset,中文版系统默认为GBK,若DB为GB2312也能显示出中文 。如果采用UTF-8编码建库只有在v4新版本下中文才不乱码。
- navicat的设定比较怪。整个服务器采用统一编码设定,如果其上的数据库采用不同的编码格式那么相互之间就会乱码。在图navicat1中设定为“使用mysql字符集”就相当于执行了一次“SET NAMES XXX”,这儿XXX似乎默认等于UTF-8,如果执行一次“show variables like 'character%';” 查询得到图navicat2。
注意“character_set_database”值为latin1,说明这是latin1的库。因为其保存的是GB内容所以查看是乱码。于是如图navicat3修改设置,于是中文显示正常
三、项目中使用了PEAR::MDB2作为数据库连接方式,数据库为UTF-8编码。测试中发现前台页面(UTF-8)中文有些是乱码的,于是使用ems v4查看,同一个表中有不乱码的有正常的。使用navicat查看,分别采用图navicat1的设置以及图navicat4的设置,乱码情况正好相反——换个设置不乱码的正常而正常会乱码。
思考半天后来发现是MDB2连接时忘了使用“SET NAMES UTF8”命令查询。因为数据库中存在原始数据所以和新插入数据的编码实则是不一样——前者是以UTF-8编码保存在UTF-8的数据库表中;后者是以被Latin1打包过的UTF-8数据保存在UTF-8数据库中。在ems v4中无论客户端是设定默认/utf8它都使用如下设定
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
而navicat8中如果指定编码格式则以上三项都是采用 Latin1编码。。。其实就和ems v3采用的同样策略。
知道了问题自然就知道了怎么解决。不过看了PEAR手册发现可以在定义dsn连接时就可以直接指定连接编码方式:
$dsn = array(
'phptype'=>DB_DATABASE,
'username'=>DB_USER,
'password'=>DB_PW,
'hostspec'=>DB_HOST,
'database'=>DB_NAME,
'charset'=>'utf8');
有了最后那个值就相当于执行了一次 "SET NAMES UTF8" 命令。
总而言之:
-
尽量使用UTF-8作为统一编码,当前后台数据库之间数据流通时就无需特别转码也无需考虑乱码,AJAX也无需考虑对中文打包转码问题。
-
后台在初始化数据库连接之后需要做一次查询,内容为“SET NAMES UTF8”,以保证mysql使用UTF-8作为传输路径三个部分的统一编码而不是默认的Latin1。否则你建立UTF-8的数据库但保存的内容却是Latin1编码格式(mysql自动在UTF-8外面包括了一层Latin1) 。
- 描述: ems v4 for lati1
- 大小: 8.8 KB
- 描述: navicat1
- 大小: 9.2 KB
- 描述: navicat2
- 大小: 8.5 KB
- 描述: navicat3
- 大小: 9.2 KB
- 描述: navicat4
- 大小: 9.1 KB
- 描述: navicat5
- 大小: 8.5 KB
分享到:
相关推荐
2. **确定Navicat安装位置**:通常,Navicat的安装目录在“C:\Program Files\Navicat for MySQL”或类似的位置。 3. **复制dll文件**:将下载的libmysql_d.dll文件复制到Navicat的安装目录下。 4. **重启Navicat**:...
2. 字符集自动检测:Navicat可以自动检测数据库和表格的字符集,并在显示时进行转换,避免乱码的出现。 3. 字符集转换工具:如果已有乱码数据,Navicat提供了转换工具,可以将数据从一种字符集转换为另一种,从而...
Navicat for MySQL是一款强大的数据库管理和开发工具,专为MySQL数据库设计。这款软件以其直观的图形界面、多语言支持和全面的功能集而受到广大用户的欢迎。在提供的“NavicatforMySQL中文绿色免安装版”中,用户...
《Navicat8_MySQL:顶级MySQL管理工具详解》 在数据库管理领域,Navicat8_MySQL是一款备受推崇的工具,以其强大的功能和友好的用户界面赢得了广大开发人员和DBA的喜爱。作为MySQL数据库管理和开发的重要助手,...
Navicat for MySQL-Navicat9解压版、navicat110_premium_cs_x86、navicat110_premium_cs_x64,含各版本注册机 亲测可用-o- Navicat Premium是一套全系列的数据库管理工具,结合了其它Navicat成员的功能,支持单一...
2. "Navicat for MySQL" - 这很可能是Navicat Premium的MySQL版本的可执行文件,用于在没有安装程序的情况下运行Navicat,以便管理MySQL数据库。 **详细知识点**: 1. **Navicat Premium**:这是一款多数据库管理...
《Navicat 10 for MySQL:高效数据库管理利器》 Navicat 是一款深受数据库管理员和开发人员喜爱的数据库管理工具,其针对MySQL数据库的版本——Navicat 10 for MySQL,更是以其强大的功能和友好的界面,为用户提供...
navicat111_mysql_cs_x64navicat111_mysql_cs_x64navicat111_mysql_cs_x64navicat111_mysql_cs_x64navicat111_mysql_cs_x64navicat111_mysql_cs_x64navicat111_mysql_cs_x64navicat111_mysql_cs_x64navicat111_mysql...
总结,Navicat for MySQL是一款集数据管理、开发和协作于一体的工具,它简化了MySQL数据库的管理工作,提升了开发效率,是数据库专业人员不可或缺的工具之一。通过熟练掌握其各项功能,用户可以更好地管理和利用...
Navicat for MySQL 64bit 是一款专为MySQL数据库设计的强大管理工具,它提供了全面的功能集,旨在简化数据库的管理、开发和协作流程。这款软件适用于64位操作系统,能够充分利用系统资源,提供更高效的性能。 首先...
【Navicat for MySQL免安装版详解】 Navicat是一款强大的数据库管理工具,专为MySQL设计,提供了直观的用户界面,使得数据库管理、开发和维护变得更加简单。免安装版的Navicat则无需进行繁琐的安装过程,用户可以...
NAVICAT是一款流行的数据库管理和开发工具,支持多种数据库系统,包括MySQL。在这个课程中,我们将深入探讨如何通过NAVICAT来创建、修改和删除视图。 ### 创建视图 创建视图的过程是将SQL查询的结果集保存为一个...
**Navicat for MySQL 10.1.7:强大的数据库管理工具** Navicat for MySQL是一款备受赞誉的数据库管理工具,专为MySQL数据库设计,它提供了强大的功能和直观的用户界面,使得数据库管理和开发变得更加高效和便捷。...
【描述】提到的"navicat for mysql for mac汉化补丁"是用于将Navicat for MySQL的原始英文界面转换为简体中文的文件集。这个汉化补丁通常是一个.zip压缩文件,解压后会包含一个或多个本地化(localization)文件,如...
在MySQL版本中,Navicat for MySQL CS x86是专为32位Windows系统设计的版本,旨在为用户提供一个集数据查看、编辑、备份、同步、导入导出等多功能于一体的平台。 二、主要功能 1. 数据库连接:Navicat允许用户轻松...
《Navicat for MySQL:一款强大的数据库管理工具》 Navicat for MySQL是一款深受数据库管理员和开发人员喜爱的数据库管理工具,专为MySQL数据库设计。它提供了直观的图形用户界面,使得用户能够轻松地进行数据库的...
【Navicat for MySQL】是一款强大的数据库管理工具,专为MySQL设计,支持多种操作系统,包括Windows版本。它提供了直观的图形用户界面,使得数据库管理和开发变得更加便捷。在无需安装的免安装版中,用户可以轻松地...
Mysql for Mac 安装及 Navicat 客户端链接 本文档将指导您如何在 Mac 上安装 Mysql 并连接 Navicat 客户端。安装 Mysql 需要通过客户端安装和命令行安装两种方式,可以根据自己的需求选择合适的安装方式。 一、...
总的来说,Navicat for MySQL 10.1.7企业版作为一个免安装的数据库管理工具,其强大的功能和易用性使其成为MySQL数据库管理的首选工具之一,尤其适合开发人员和DBA在日常工作中快速高效地进行数据库操作和管理。
navicat_for_mysql_10.0.1_cn_linux.tar安装包 下载后copy到指定安装目录 ...[hcr@localhost navicat111_mysql_en]$ tar -zxvf navicat111_mysql_en.tar.gz [hcr@localhost navicat111_mysql_en]$ ./start_navicat