mysql选择字符集考虑的因素:
1)utf-8国际字符集,支持不同语言的国家和地区。
2)如数据库只需要支持一般的中文,数据量较大,性能要求也比较高,那就选择双字节定长编码的中文字符集如gbk。gbk:汉子占2个字节,utf-8占3个字节。但是gbk的西文字符编码都是2个字节
3)如果应用对应用中涉及已有的数据导入,就要充分考虑数据库字符集对已有数据的兼容性。如已有数据是gbk文字,如果选择gb2312为数据库字符集,就很可能出现某些文字无法正确导入的现象
4)如果所有的客户端程序都支持相同的字符集,则应该优先选择该字符集作为数据库字符集。这样可以避免因字符集转换带来的性能开销和损失。
字符集相关参数解析:
一些字符集和校对规则系统变量与客户端和服务器的交互有关
· 默认数据库的字符集和校对规则可以用作character_set_database和collation_database变量的值。
mysql> show variables like 'character_set%';
+--------------------------+---------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /opt/mysql/mysql-5.5.37-linux2.6-x86_64/share/charsets/ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)
character_set_client:客户端字符集即character_set_client变量作为客户端发送的查询中使用的字符集。
character_set_connection:连接字符集即服务器接收到查询后应该转换为的字符集
character_set_results :结果字符集即服务器把结果集或错误信息返回客户端之前应该转换的字符集即:变量指示服务器返回查询结果到客户端使用的字符集。
服务器级别 > 数据库级别 > 表级别 >s 列级别
character_set_server: 服务器的默认字符集。
character_set_database 默认数据库使用的字符集。当默认数据库更改时,服务器则设置该变量。如果没有默认数据库,变量的值同character_set_server。
character_set_filesystem:本地文件系统文件所使用的字符集
character_set_system:系统字符集。用于数据库中对象(如表和列)的名字,也用于存储在目录表中函数的名字。其值总是等于utf8,
通常的使用中,character_set_client,character_set_connection这两个变量的值是一样的,也就是说查询不需要进行编码转换。这样看来变量character_set_connection有些多余。当查询进入时,查询会被服务器从 character_set_client转换到character_set_connection,当查询执行时,查询会被服务器从 character_set_connection转换到列字符集。查询反回时,数据直接被服务器从列字符集转换到 character_set_results。很显然查询进入比查询返回多经历了一次转换。
转换时,服务器使用 character_set_connection和collation_connection系统变量。它将客户端发送的查询从 character_set_client系统变量转换到character_set_connection(除非字符串文字具有象_latin1或 _utf8的引介词)。collation_connection对比较文字字符串是重要的。对于列值的字符串比较,它不重要,因为列具有更高的 校对规则优先级
character_set_results 变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。
如何查看mysql字符集:
1)查看mysql默认的字符集可以查看 /etc/my.cfg
2)查看 MySQL 数据库服务器和数据库字符集当前session的字符集:
mysql> show variables like 'character%';
3)查看 MySQL 数据表(table) 的字符集
mysql> show create table test \G;
4)查看 MySQL 数据列(column)的字符集
mysql> show full columns from test;
5)查看当前安装的 MySQL 所支持的字符集
mysql> show charset;
mysql> show char set;
源码安装mysql的时候设置字符集:
安装数据库的时候,默认字符集是latin1,MySQL5.5版本,5.1版本可以通过--with-charset=utf8 --with-collation=utf8_general_ci来设置字符集和就对规则;
5之前版本用DEFAULT_CHARSET=utf8和DEFAULT_COLLATION=utf8_general_ci这两个参数
1)源码安装的可以
shell>./configure --with-character=CHARSET
shell>./configure -- with-collation=COLLATION
2)修改my.cfg
[mysqld]
default-character-set=utf8(mysql 5.5 版本添加character-set-server=utf8)
[client]
default-character-set=utf8
3)还有一种修改mysql默认字符集的方法,就是使用mysql的命令
mysql> SET character_set_client = utf8 ;
mysql> SET character_set_connection = utf8 ;
mysql> SET character_set_database = utf8 ;
mysql> SET character_set_results = utf8 ;
mysql> SET character_set_server = utf8 ;
mysql> SET collation_connection = utf8 ;
mysql> SET collation_database = utf8 ;
1)utf-8国际字符集,支持不同语言的国家和地区。
2)如数据库只需要支持一般的中文,数据量较大,性能要求也比较高,那就选择双字节定长编码的中文字符集如gbk。gbk:汉子占2个字节,utf-8占3个字节。但是gbk的西文字符编码都是2个字节
3)如果应用对应用中涉及已有的数据导入,就要充分考虑数据库字符集对已有数据的兼容性。如已有数据是gbk文字,如果选择gb2312为数据库字符集,就很可能出现某些文字无法正确导入的现象
4)如果所有的客户端程序都支持相同的字符集,则应该优先选择该字符集作为数据库字符集。这样可以避免因字符集转换带来的性能开销和损失。
字符集相关参数解析:
一些字符集和校对规则系统变量与客户端和服务器的交互有关
· 默认数据库的字符集和校对规则可以用作character_set_database和collation_database变量的值。
mysql> show variables like 'character_set%';
+--------------------------+---------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /opt/mysql/mysql-5.5.37-linux2.6-x86_64/share/charsets/ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)
character_set_client:客户端字符集即character_set_client变量作为客户端发送的查询中使用的字符集。
character_set_connection:连接字符集即服务器接收到查询后应该转换为的字符集
character_set_results :结果字符集即服务器把结果集或错误信息返回客户端之前应该转换的字符集即:变量指示服务器返回查询结果到客户端使用的字符集。
注:上面三个参数用于客户端/服务器沟通,通常是应该相同的。用SET NAMES ***和 [mysql] default-character-set=gbk可以同时设置三者的值。也可以单独设置。
ps:参数--default-character-set=name这个选项在导出数据的时候非常重要,如果客户端字符集和数据库字符集不一致,数据在导出的时候就需要进行字符集转换,将数据库字符集转换成客户端字符集经过转换后的数据可有可能称为乱码或特殊字符,使得备份文件无法恢复。所以得导出命令语句中可以用加上这个参数手工设置使客户端字符集和服务端字符集一样服务器级别 > 数据库级别 > 表级别 >s 列级别
character_set_server: 服务器的默认字符集。
character_set_database 默认数据库使用的字符集。当默认数据库更改时,服务器则设置该变量。如果没有默认数据库,变量的值同character_set_server。
character_set_filesystem:本地文件系统文件所使用的字符集
character_set_system:系统字符集。用于数据库中对象(如表和列)的名字,也用于存储在目录表中函数的名字。其值总是等于utf8,
通常的使用中,character_set_client,character_set_connection这两个变量的值是一样的,也就是说查询不需要进行编码转换。这样看来变量character_set_connection有些多余。当查询进入时,查询会被服务器从 character_set_client转换到character_set_connection,当查询执行时,查询会被服务器从 character_set_connection转换到列字符集。查询反回时,数据直接被服务器从列字符集转换到 character_set_results。很显然查询进入比查询返回多经历了一次转换。
转换时,服务器使用 character_set_connection和collation_connection系统变量。它将客户端发送的查询从 character_set_client系统变量转换到character_set_connection(除非字符串文字具有象_latin1或 _utf8的引介词)。collation_connection对比较文字字符串是重要的。对于列值的字符串比较,它不重要,因为列具有更高的 校对规则优先级
character_set_results 变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。
如何查看mysql字符集:
1)查看mysql默认的字符集可以查看 /etc/my.cfg
2)查看 MySQL 数据库服务器和数据库字符集当前session的字符集:
mysql> show variables like 'character%';
3)查看 MySQL 数据表(table) 的字符集
mysql> show create table test \G;
4)查看 MySQL 数据列(column)的字符集
mysql> show full columns from test;
5)查看当前安装的 MySQL 所支持的字符集
mysql> show charset;
mysql> show char set;
源码安装mysql的时候设置字符集:
安装数据库的时候,默认字符集是latin1,MySQL5.5版本,5.1版本可以通过--with-charset=utf8 --with-collation=utf8_general_ci来设置字符集和就对规则;
5之前版本用DEFAULT_CHARSET=utf8和DEFAULT_COLLATION=utf8_general_ci这两个参数
注:这也是最一劳永逸的办法,这样指定后,客户端连接到数据库的编码方式也默认是utf8了,应用程序不需要任何处理。但是如果编译安装MySQL的时候没有指定这两个参数,大多数人更是通过二进制程序的方式安装,那么这时候MySQL的默认字符集是latin1。
1)源码安装的可以
shell>./configure --with-character=CHARSET
shell>./configure -- with-collation=COLLATION
2)修改my.cfg
[mysqld]
default-character-set=utf8(mysql 5.5 版本添加character-set-server=utf8)
[client]
default-character-set=utf8
3)还有一种修改mysql默认字符集的方法,就是使用mysql的命令
mysql> SET character_set_client = utf8 ;
mysql> SET character_set_connection = utf8 ;
mysql> SET character_set_database = utf8 ;
mysql> SET character_set_results = utf8 ;
mysql> SET character_set_server = utf8 ;
mysql> SET collation_connection = utf8 ;
mysql> SET collation_database = utf8 ;
mysql> SET collation_server = utf8 ;
注:修改my.cfg[mysqld]character-set-server=utf8和[client]default-character-set=utf8
设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,存入数据库的仍然是乱码。那connection连接层上可能出了问题。客户端这时候一般需要指定utf8方式连接才能避免乱码。也就是传说中的set names命令。事实上,set names utf8命令对应的是服务器端以下几个命令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = xutf8;