乱码产生原因 mysql字符编码是版本4.1引入的,支持多国语言,而且一些特性已经超过了其他的数据库系统。 我们可以在MySQLCommandLineClient下输入如下命令查看mysql的字符集 mysql>SHOWCHARACTERSET; +----------+-----------------------------+---------------------+--------+ |Charset|Description|Defaultcollation|Maxlen| +----------+-----------------------------+---------------------+--------+ |big5|Big5TraditionalChinese|big5_chinese_ci|2| |dec8|DECWestEuropean|dec8_swedish_ci|1| |cp850|DOSWestEuropean|cp850_general_ci|1| |hp8|HPWestEuropean|hp8_english_ci|1| |koi8r|KOI8-RRelcomRussian|koi8r_general_ci|1| |latin1|cp1252WestEuropean|latin1_swedish_ci|1| |latin2|ISO8859-2CentralEuropean|latin2_general_ci|1| |swe7|7bitSwedish|swe7_swedish_ci|1| |ascii|USASCII|ascii_general_ci|1| |ujis|EUC-JPJapanese|ujis_japanese_ci|3| |sjis|Shift-JISJapanese|sjis_japanese_ci|2| |hebrew|ISO8859-8Hebrew|hebrew_general_ci|1| |tis620|TIS620Thai|tis620_thai_ci|1| |euckr|EUC-KRKorean|euckr_korean_ci|2| |koi8u|KOI8-UUkrainian|koi8u_general_ci|1| |gb2312|GB2312SimplifiedChinese|gb2312_chinese_ci|2| |greek|ISO8859-7Greek|greek_general_ci|1| |cp1250|WindowsCentralEuropean|cp1250_general_ci|1| |gbk|GBKSimplifiedChinese|gbk_chinese_ci|2| |latin5|ISO8859-9Turkish|latin5_turkish_ci|1| |armscii8|ARMSCII-8Armenian|armscii8_general_ci|1| |utf8|UTF-8Unicode|utf8_general_ci|3| |ucs2|UCS-2Unicode|ucs2_general_ci|2| |cp866|DOSRussian|cp866_general_ci|1| |keybcs2|DOSKamenickyCzech-Slovak|keybcs2_general_ci|1| |macce|MacCentralEuropean|macce_general_ci|1| |macroman|MacWestEuropean|macroman_general_ci|1| |cp852|DOSCentralEuropean|cp852_general_ci|1| |latin7|ISO8859-13Baltic|latin7_general_ci|1| |cp1251|WindowsCyrillic|cp1251_general_ci|1| |cp1256|WindowsArabic|cp1256_general_ci|1| |cp1257|WindowsBaltic|cp1257_general_ci|1| |binary|Binarypseudocharset|binary|1| |geostd8|GEOSTD8Georgian|geostd8_general_ci|1| |cp932|SJISforWindowsJapanese|cp932_japanese_ci|2| |eucjpms|UJISforWindowsJapanese|eucjpms_japanese_ci|3| +----------+-----------------------------+---------------------+--------+ 36rowsinset(0.02sec) 更多mysql的字符集知识可以参考本论坛的 http://www.phpfans.net/bbs/viewt...&extra=page%3D1 或者mysql官方的 http://dev.mysql.com/doc/refman/5.1/zh/charset.html MySQL4.1的字符集支持(CharacterSetSupport)有两个方面:字符集(Characterset)和排序方式(Collation)。对于字符集的支持细化到四个层次:服务器(server),数据库(database),数据表(table)和连接(connection)。 查看系统的字符集和排序方式的设定可以通过下面的两条命令: mysql>SHOWVARIABLESLIKE'characterset%'; +--------------------------+-------------------------------------------+ |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_setsdir|D:MySQLMySQLServer5.0sharecharsets| +--------------------------+-------------------------------------------+ 8rowsinset(0.06sec) mysql>SHOWVARIABLESLIKE'collation%'; +----------------------+-------------------+ |Variable_name|Value| +----------------------+-------------------+ |collation_connection|latin1_swedish_ci| |collation_database|latin1_swedish_ci| |collation_server|latin1_swedish_ci| +----------------------+-------------------+ 3rowsinset(0.02sec) 上面列出的值就是系统的默认值。latin1默认校对规则是latin1_swedish_ci,默认是latin1的瑞典语排序方式. 为什么呢默认会是latin1_swedish_ci呢,追溯一下mysql历史很容易发现 1979年,一家瑞典公司Tcx欲开发一个快速的多线程、多用户数据库系统。Tcx公司起初想利用mSQL和他们自己的快速低级例程(IndexedSequentialAccessMethod,ISAM)去连接数据库表,然而,在一些测试以后得出结论:mSQL对其需求来说不够快速和灵活。这就产生了一个连接器数据库的新SQL接口,它使用几乎和mSQL一样的API接口。这个API被设计成可以使那些由mSQL而写的第三方代码更容易地移植到MySQL。 相信如果mysql是中国开发的,那么汉语也是默认编码了 当然我们也可以自己需要修改mysql的默认字符集 在mysql配置文档my.ini,找到如下两句: [mysql] default-character-set=latin1 和 #createdandnocharactersetisdefined default-character-set=latin1 修改后面的值就可以。 这里不建议改,仍保留默认值 也就是说启动mysql时,如果没指定指定一个默认的的字符集,这个值继承自配置文件中的; 此时character_set_server被设定为这个默认的字符集;当创建一个新的数据库时, 除非明确指定,这个数据库的字符集被缺省设定为character_set_server;当选定了一个数据库时, character_set_database被设定为这个数据库默认的字符集;在这个数据库里创建一张表时, 表默认的字符集被设定为character_set_database,也就是这个数据库默认的字符集; 当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集。 这样问题就随之而来了,假如一数据库是gbk编码。如果访问数据库时没指定其的字符集是gbk。 那么这个值将继承系统的latin1,这样就做成mysql中文乱码。 乱码解决方法 要解决乱码问题,首先必须弄清楚自己数据库用什么编码。如果没有指明,将是默认的latin1。 我们用得最多的应该是这3种字符集gb2312,gbk,utf8。 那么我们如何去指定数据库的字符集呢?下面也gbk为例 【在MySQLCommandLineClient创建数据库】 mysql>CREATETABLEmysqlcode ( ->id TINYINT(255)UNSIGNEDNOTNULLAUTO_INCREMENTPRIMARYKEY, ->content VARCHAR(255)NOTNULL ->)TYPE=MYISAMCHARACTERSETgbkCOLLATEgbk_chinese_ci; QueryOK,0rowsaffected,1warning(0.03sec) mysql>descmysqlcode; +---------+-----------------------+------+-----+---------+----------------+ |Field|Type|Null|Key|Default|Extra| +---------+-----------------------+------+-----+---------+----------------+ |id|tinyint(255)unsigned|NO|PRI||auto_increment| |content|varchar(255)|NO|||| +---------+-----------------------+------+-----+---------+----------------+ 2rowsinset(0.02sec) 其中后面的TYPE=MYISAMCHARACTERSETgbkCOLLATEgbk_chinese_ci; 就是指定数据库的字符集,COLLATE(校勘),让mysql同时支持多种编码的数据库。 当然我们也可以通过如下指令修改数据库的字符集 alterdatabaseda_namedefaultcharacterset'charset'. php爱好者站http://www.phpfans.net 客户端以gbk格式发送,可以采用下述配置: SETcharacter_set_client='gbk' SETcharacter_set_connection='gbk' SETcharacter_set_results='gbk' 这个配置就等价于SETNAMES'gbk'。 现在对刚才创建的数据库操作 mysql>usetest; Databasechanged mysql>insertintomysqlcodevalues(null,'php爱好者'); ERROR1406(22001):Datatoolongforcolumn'content'atrow1 没有指定字符集为gbk,插入时出错 mysql>setnames'gbk'; QueryOK,0rowsaffected(0.02sec) 指定字符集为gbk mysql>insertintomysqlcodevalues(null,'php爱好者'); QueryOK,1rowaffected(0.00sec) 插入成功 mysql>selectfrommysqlcode; +----+-----------+ |id|content| +----+-----------+ |1|php爱好着| +----+-----------+ 1rowinset(0.00sec) 在没有指定字符集gbk时读取也会出现乱码,如下 mysql>selectfrommysqlcode; +----+---------+ |id|content| +----+---------+ |1|php???| +----+---------+ 1rowinset(0.00sec) 【在phpmyadmin创建数据库,并指定字符集】
表类型根据自己需要选,这里选MyISAM(非事务); 整理选择 gbk_chinese_ci 也就是gbk字符集 gbk_bin 简体中文,二进制。gbk_chinese_ci 简体中文,不区分大小写。在刚才创建的数据库插入数据库 再浏览时发现是乱码
为什么呢?是因为数据库为gbk字符集,而我们操作时没有指定为gbk 回到数据库首页
可以看到 mysql 连接校对默认的latin1_bin。我们将其改为gbk_chinese_ci
再插入一条数据。看,这条已经正常了
 【解决php读取数据库乱码】 仍以数据库mysqlcode为例 <div class="codetitle"><a style="CURSOR: pointer" data="88460" class="copybut" id="copybut88460" onclick="doCopy('code88460')"> 代码如下:<div class="codebody" id="code88460"> <?php //php爱好者站教程http://www.phpfans.net $conn=mysql_connect("localhost","root",""); mysql_query("setnames'gbk'");//这就是指定数据库字符集,一般放在连接数据库后面就系了 mysql_select_db("test"); $sql="selectfrommysqlcode"; $result=mysql_query($sql,$conn); ?> <metahttp-equiv="Content-Type"content="text/html;charset=gb2312"/> mysql字符编码 <tablewidth="300"height="32"border="1"align="center"cellpadding="0"cellspacing="0"> <tr> <tdwidth="71"align="center">id</td> <tdwidth="229"align="center">内容</td> </tr> <?phpwhile($row=mysql_fetch_assoc($result)){ echo" <tr> <tdalign="center">".$row['id']."</td> <td>".$row['content']."</td> </tr>"; }?> </table>
|