MYSQL字符集问题
MySQL的字符集支持(CharacterSetSupport)有两个方面:
字符集(Characterset)和排序方法(Collation)。
对于字符集的支持细化到四个层次:
服务器(server),数据库(database),数据表(table)和联接(connection)。
1.MySQL默认字符集
MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应当用哪些字符集。
然而,传统的程序在创建数据库和数据表时并没有使用这么复杂的配置,它们用的是默认的配置,这么,默认的配置从何而至呢?(1)编译MySQL时,指定了一个默认的字符集,这个字符集是latin1;
(2)安装MySQL时,可以在配置文件(my.ini)食指定一个默认的的字符集,倘若没指定,这个值承继自编译时指定的;
(3)启动mysqld时,可以在命令行参数食指定一个默认的的字符集,倘若没指定,这个值承继自配置文件中的配置,此时character_set_server被设定为这个默认的字符集;
(4)当创建一个新的数据库时,除非明晰指定,这个数据库的字符集被缺省设定为character_set_server;
(5)当选取了一个数据库时,character_set_database被设定为这个数据库默认的字符集;
(6)在这个数据库里创建一张表时,表默认的字符集被设定为character_set_database,也就是这个数据库默认的字符集;
(7)当在表内设置一栏时,除非明晰指定,否则此栏缺省的字符集就是表默认的字符集;
简单的总结一下,假如哪些地方都不更改linux 输入法,这么所有的数据库的所有表的所有栏位的都用
latin1储存,不过我们假如安装MySQL,通常还会选择多语言支持,也就是说,安装程序会手动在配置文件中把
default_character_set设置为UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用UTF-8储存。
2.查看默认字符集(默认情况下,mysql的字符集是latin1(ISO_8859_1)
一般,查看系统的字符集和排序方法的设定可以通过下边的两条命令:
mysql>SHOWVARIABLESLIKE'character%';
+--------------------------+---------------------------------+
|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|D:"mysql-5.0.37"share"charsets"|
+--------------------------+---------------------------------+
mysql>SHOWVARIABLESLIKE'collation_%';
+----------------------+-----------------+
|Variable_name|Value|
+----------------------+-----------------+
|collation_connection|utf8_general_ci|
|collation_database|utf8_general_ci|
|collation_server|utf8_general_ci|
+----------------------+-----------------+
3.更改默认字符集
(1)最简单的更改方式,就是更改mysql的my.ini文件中的字符集通配符,
如default-character-set=utf8
character_set_server=utf8
更改完后,重启mysql的服务,servicemysqlrestart
使用mysql>SHOWVARIABLESLIKE'character%';查看,发觉数据库编码均已改成utf8
+--------------------------+---------------------------------+
|Variable_name|Value|
+--------------------------+---------------------------------+
|character_set_client|utf8|
|character_set_connection|utf8|
|character_set_database|utf8|
|character_set_filesystem|binary|
|character_set_results|utf8|
|character_set_server|utf8|
|character_set_system|utf8|
|character_sets_dir|D:"mysql-5.0.37"share"charsets"|
+--------------------------+---------------------------------+
(2)还有一种更改字符集的方式,就是使用mysql的命令
mysql>SETcharacter_set_client=utf8;
MySQL中涉及的几个字符集
character-set-server/default-character-set:服务器字符集,默认情况下所采用的。
character-set-database:数据库字符集。
character-set-table:数据库表字符集。
优先级依次降低。所以通常情况下只须要设置character-set-server,而在创建数据库和表时不非常指定字符集,这样统一采用character-set-server字符集。
character-set-client:顾客端的字符集。顾客端默认字符集。当顾客端向服务器发送恳求时,恳求以该字符集进行编码。
character-set-results:结果字符集。服务器向顾客端返回结果或则信息时,结果以该字符集进行编码。
在顾客端,假如没有定义character-set-results,则采用character-set-client字符集作为默认的字符集。所以只须要设置character-set-client字符集。
要处理英文,则可以将character-set-server和character-set-client均设置为GB2312,假如要同时处理多国语言,则设置为UTF8。
关于MySQL的英文问题
解决乱码的方式是,在执行SQL句子之前,将MySQL以下三个系统参数设置为与服务器字符集character-set-server相同的字符集。
character_set_client:顾客端的字符集。
character_set_results:结果字符集。
character_set_connection:联接字符集。
设置这三个系统参数通过向MySQL发送句子:setnamesgb2312
关于GBK、GB2312、UTF8
UTF-8:UnicodeTransformationFormat-8bit,容许含BOM,但一般不含BOM。是用以解决国际上字符的一种多字节编码,它对英语使用8位(即一个字节),英文使用24为(三个字节)来编码。UTF-8包含全世界所有国家须要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,倘若是UTF8编码,则在外国人的英语IE上也能显示英文,她们无需下载IE的英文语言支持包。
GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示linux mysql 命令行输入不了中文,为了分辨英文,将其最低位都设定成1。GBK包含全部英文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。
GBK、GB2312等与UTF8之间都必须通过Unicode编码能够互相转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
对于一个网站、论坛来说,假如俄文字符较多,则建议使用UTF-8节约空间。不过如今好多峰会的插件通常只支持GBK。
GB2312是GBK的子集,GBK是GB18030的子集
GBK是包括中韩字符的大字符集合
假如是英文的网站推荐GB2312GBK有时还是有点问题
为了防止所有乱码问题,应当采用UTF-8,将来要支持国际化也十分便捷
UTF-8可以看作是大字符集,它包含了大部份文字的编码。
使用UTF-8的一个用处是其他地区的用户(如台湾日本)无需安装繁体英文支持才能正常观看你的文字而不会出现乱码。
gb2312是繁体英文的码
gbk支持繁体英文及简体英文
big5支持简体英文
utf-8支持几乎所有字符
首先剖析乱码的情况
1.写入数据库时作为乱码写入
2.查询结果以乱码返回
到底在发生乱码时是哪一种情况呢?
我们先在mysql命令行下输入
showvariableslike'%char%';
查看mysql字符集设置情况:
mysql>showvariableslike'%char%';
+--------------------------+----------------------------------------+
|Variable_name|Value|
+--------------------------+----------------------------------------+
|character_set_client|gbk|
|character_set_connection|gbk|
|character_set_database|gbk|
|character_set_filesystem|binary|
|character_set_results|gbk|
|character_set_server|gbk|
|character_set_system|utf8|
|character_sets_dir|/usr/local/mysql/share/mysql/charsets/|
+--------------------------+----------------------------------------+
在查询结果中可以见到mysql数据库系统中顾客端、数据库联接、数据库、文件系统、查询
结果、服务器、系统的字符集设置
在这儿,文件系统字符集是固定的,系统、服务器的字符集在安装时确定linux mysql 命令行输入不了中文,与乱码问题无关
乱码的问题与顾客端、数据库联接、数据库、查询结果的字符集设置有关
*注:顾客端是看访问mysql数据库的形式,通过命令行访问,命令行窗口就是顾客端,通
过JDBC等联接访问,程序就是顾客端
我们在向mysql写入英文数据时,在顾客端、数据库联接、写入数据库时分别要进行编码转
换
在执行查询时,在返回结果、数据库联接、客户端分别进行编码转换
如今我们应当清楚,乱码发生在数据库、客户端、查询结果以及数据库联接这其中一个或多
个环节
接出来我们来解决这个问题
在登陆数据库时,我们用mysql--default-character-set=字符集-uroot-p进行联接,这时我们
再用showvariableslike'%char%';命令查看字符集设置情况,可以发觉顾客端、数据库联接、
查询结果的字符集早已设置成登陆时选择的字符集了
假如是早已登陆了,可以使用setnames字符集;命令来实现上述疗效,等同于下边的命令:
setcharacter_set_client=字符集
setcharacter_set_connection=字符集
setcharacter_set_results=字符集
假如遇到上述命令无效时,也可采用一种最简单最彻底的方式:
一、Windows
1、中止MySQL服务
2、在MySQL的安装目录下找到my.ini,假如没有就把my-medium.ini复制为一个my.ini即可
3、打开my.ini之后,在[client]和[mysqld]下边均加上default-character-set=utf8,保存并关掉
4、启动MySQL服务
要彻底解决编码问题,必须使
|character_set_client|gbk|
|character_set_connection|gbk|
|character_set_database|gbk|
|character_set_results|gbk|
|character_set_server|gbk|
|character_set_system|utf8
这种编码相一致,都统一。
假如是通过JDBC联接数据库,可以这样写URL:
URL=jdbc:mysql://localhost:3306/abs?useUnicode=true&characterEncoding=字符集
JSP页面等终端也要设置相应的字符集
数据库的字符集可以更改mysql的启动配置来指定字符集,也可以在createdatabase时加上
defaultcharacterset字符集来强制设置database的字符集
通过这样的设置,整个数据写入读出流程中都统一了字符集,就不会出现乱码了
为何从命令行直接写入英文不设置也不会出现乱码?
可以明晰的是从命令行下,顾客端、数据库联接、查询结果的字符集设置没有变化
输入的英文经过一系列转码又转到初始的字符集,我们查看到的其实不是乱码
但这并不代表英文在数据库里被正确作为英文字符储存
举例来说,现今有一个utf8编码数据库,顾客端联接使用GBK编码,connection使用默认
的ISO8859-1(也就是mysql中的latin1),我们在顾客端发送“中文”这个字符串,顾客端
将发送一串GBK格式的二补码码给connection层,connection层以ISO8859-1格式将这段
二补码码发送给数据库,数据库将这段编码以utf8格式储存出来linux手机软件,我们将这个数组以utf8
格式读取下来,肯定是得到乱码,也就是说英文数据在写入数据库时是以乱码方式储存的,
在同一个顾客端进行查询操作时,做了一套和写入时相反的操作,错误的utf8格式二补码
码又被转换成正确的GBK码并正确显示下来。