BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #73同步于 2006/9/23
Database机器人发帖

Re: 关于字符集的问题,如何使用中文

chit
2006/9/23镜像同步0 回复
自从mysql4.1开始,mysql对中文的支持问题是比较烦人的,怎么弄都乱码,如今mysql5 据说是mysql的新纪元,但从官方下载安装的mysql5仍存在乱码现象,这里就是针对此现象做的讨论: 建议最好是下载mysql的源码进行编译,这是由于官方编译的mysql的默认支持编码是latin字符集,所以中文字符在数据库里查看的时候看到的是乱码。编译MySQL时使用–with–charset=编码,可以方便地把mysql编译成该编码形式,这样MySQL就会直接支持中文查找和排序,--with-extra-charsets参数指定其它可用的字符集。 下载并解压源码包,打开INSTALL-SOURCE,这里介绍了linux下详细的安装方法,所以大家所要注意的只是下面的configure指令: shell> ./configure --with-charset=gbk --with-collation=gbk_chinese_ci --with-extra-charsets=gb2312,big5,utf8,binary,ascii --prefix=/usr/local/mysql shell> make shell> make install shell> cp support-files/my-medium.cnf /etc/my.cnf shell> cd /usr/local/mysql shell> bin/mysql_install_db --user=mysql shell> chown -R root . shell> chown -R mysql var shell> chgrp -R mysql . shell> bin/mysqld_safe --user=mysql & shell> bin/mysql mysql> show variables; 你可以看到全局的字符集参数全是gbk,gb2312字集应该包含在gbk里,所以不讨论。 进行和平常mysql4.0一样的php操作,你会发现仍然出现中文乱码现象。 这里要说明的是:从mysql5开始,必需在mysql数据库连接后对应用的字符集做出说明,否则非英文字母的文字存取都无法解释变成?号。 解决方法就是要适应新版mysql的要求,在连接mysql数据库后执行set character set 字符集: set character set gbk; 在php里应该是这么写:mysql_query("set character set gbk"); 指令大小写均可 phpwind和discuz是广泛应用的国产php论坛,大量的朋友在应用它,了解了以上步骤,你也可以对论坛源码进行很小的修改,安全地把数据库升级到mysql5: 找到include/db_mysql.php,修改function connect(...){.....} 在选择数据库mysql_select_db($dbname);后面加上一句mysql_query('set character set gbk');存盘。 二. 如果存入非gbk字符,这时候你需要先在导入文件的头部加一行: SET NAMES '字符集'; 并注意最后也是;号,别漏了。 文件导入和导出执行 mysql -u用户名 -p密码 数据库名<data.sql mysqldump -u用户名 -p密码 数据库名>data.sql 如果用mysqldump导出数据出现了乱码也没有关系,可以运行iconv来转换一下: iconv -c -f utf8 -t gbk 库文件名>新的gbk的库文件名 综上所述,你要注意: 1。尽量在需要导入的库文件的开头加入set names 'gbk';告诉mysql你要导入的是一个gbk的文件; 2。在mysql上使用 show variables;或show variables like 'character_set_%'; 用来查看当前的字集状态。 3。如果出现乱码也不要怕,其一是你要注意留存原有的备份,其二是用iconv来进行转化。 #PHP连接问题: 由于MySQL 4.1版本开始密码的hash算法改变,所以连接数据库时可能会出现Client does not support authentication protocol问题。 可以通过一下两种方法解决数据库用户密码不符问题: 其一: mysql> SET PASSWORD FOR 'some_user'@'some_host' = OLD_PASSWORD('newpwd'); 其二: mysql> UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd') WHERE Host = 'some_host' AND User = 'some_user' PHP输出的其它乱码问题: 如果将mysql编译为默认编码gbk的话,又会造成非gbk数据直接导入显示为乱码,比如部份utf8存储的字符,如果你大部份数据是utf8字集,当然得把mysql编译为默认编码utf8才合适。 Mysql 4.1.x出来以后,引入了collation (校勘)的概念,终于有办法让mysql同时支持多种编码的数据库了,所以PHP要用以下SQL语句来创建utf-8编码的数据库: CREATE DATABASE `mytest` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 但是仅仅是将数据库的校勘改为utf-8是不够的,还必须在连接了mysql数据库之后用这个语句来设置:set names 'utf8';才能在php程序里得到正确编码的字符,并将其显示在web页面里。 mysql_query("set names 'utf8'",$connection); 具体WIN下的mysql5方法也雷同,编译源码的方法参照源码包里INSTALL-WIN-SOURCE,由于WIN下的编译需要Visual Studio 2003,所以没有尝试过。无法自行编译win-mysql的mysql用户可以通过更改my.ini,在[client][mysqld]这两节分别写入default-character-set=gbk如: [mysqld] basedir=D:/mysql datadir=D:/mysql-data/data default-character-set=gbk [client] default-character-set=gbk 【 在 tiemeng (铁米) 的大作中提到: 】 : 看了一些文章 : mysql建库的时候用utf-8 : 应该用utf-unicode-ci? : ...................
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。