既然今天写了个博客序言,今天总还得写点别的什么东西吧,呵呵!
好啦,现在就来个现炒现卖的。
由于本人正在做一个数据库迁移工具,主要是在Access、FoxPro、SQLServer、MySQL、Oracle、DBase、Paradox等桌面的,服务器型的各类数据库之间进行整个数据库的迁移,但是由于以前很少接触过MySQL、Oracle等数据库,就按以前操作Access、SQLServer、FoxPro等数据库的方式进行操作,结果可想而知喽,不是这里出现错误,就是那里出现错误。还好,现在互联网如此发达,有什么问题直接Google一下或者Baidu一下,一般来说都可以找到比较满意的答案,但是,也有一些问题是很难在网上找到答案的,或者只能找到相类似的答案。
总的说来,MySQL出现中文乱码主要由字符集的设置不同而引起的:
说来MySQL也算变态,它的字符集的设置遍及整个数据库的方方面面,有服务器字符设置,有客户端字符设置,有数据库级别的字符集设置,有数据表级别的字符集设置,还有字段级别的字符集设置,还有连接字符串方面的,有时设置了这头忘记了那头,只要有一头没有设置,所以难免会出现中文乱码的问题。所以要解决出现中文乱码的问题还是要将上面提到的各个方面都设置成支持中文的字符集。
既然找到了问题的根源,就可以对症下药了,解决方案如下:
一、在创建数据库的时候指定字符集,如果你是在某种数据库工具如MySQL-Front下创建数据库,工具在创建数据库时自然会叫你选择一种字符集,一般来说,选择uft8为最好。如果你是在程序中动态创建数据库,那么你必须在创建数据库时加上一句:default character set utf8 collate utf8_general_ci;,比如这样一条创建数据库指令:Create Database YourDatabaseName default character set utf8 collate utf8_general_ci;
二、同理,在创建数据表时,如果是使用某种数据库工具创建数据表,也肯定会叫你选择字符集的,你选择utf8就行,如果是动态创建数据表,在创建数据表的末尾也要加上一句:Engine=MyISAM default charset utf8 collate utf8_general_ci。比如这样一条创建数据表的指令:Create Table YourTableName(字段一 Int Not Null,字段二 VarChar(10)) Engine=MyISAM default charset utf8 collate utf8_general_ci
三、在创建数据库和数据表时如果指定了字符集,那么一般来说数据表的列会自动应用与数据表相同的字符集,不需要单独对数据表的列进行字符集设置。
四、最后在连接数据库时也一样要加上字符集设置,比如:"Server=" & YourServerName & ";Database=" & YourDatabaseName & ";UID=" & YourUserName & ";PWD=" & YourPassword & ";charset=utf8;"
五、前面几点提到的字符集设置一定要统一设置成utf8,当然或许也可以设置成GBK或GB2312等,这个我没测试过,但有一点是必须的,就是一定要统一。
做到上面几点,基本就不会出现字符串乱码的问题了,也不会出现插入包含中文内容的值时出现异常了。
我也是现学现卖,虽然我解决了显示和插入值时出现中文乱码的问题,但是,我在连接数据库名称是中文的数据库时却出现服务器不认识该数据库的错误,显示错误信息是Unknow Database ????,这个问题我到现在也解决不了,网上相关的信息也相当少,有哪位高人如果看到我的博客,能否指点一二?