注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Oracle、MySQL资料及经验

.

 
 
 

日志

 
 

MySQL字符集  

2015-09-30 14:09:09|  分类: MySQL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
mysql可以在服务器、库、表级进行字符集设定,常用的存储引擎都支持。
显示数据库支持哪些字符集:show character set;
| Charset  | Description                          | Default collation      | Maxlen 
 gb2312   | GB2312 Simplified Chinese | gb2312_chinese_ci   |      2
    gbk      | GBK Simplified Chinese      | gbk_chinese_ci          |      2
    utf8      | UTF-8 Unicode                    | utf8_general_ci          |      3 
utf8mb4  | UTF-8 Unicode                | utf8mb4_general_ci       |      4 
   utf16    | UTF-16 Unicode              | utf16_general_ci             |      4 
   utf32    | UTF-32 Unicode              | utf32_general_ci             |      4
gb2312时gbk的子集,utf8对于英文使用一个字节编码。
对于中文使用3字节编码,gbk是utf8的子集。
utf8mb4从5.5引入,为了处理emoji这类表情字符,utf8mb4一个字符吃用4个字节编码。
Default collation中的ci是case insensitive,表示大小写不敏感,以上常见字符都是不敏感;cs是case sensitive,表示大小写敏感。binary,二进制大小写敏感。
字符集和校对规则的设定层次:首先连接数据库,执行操作时所使用的字符集。其次是保存数据时所用的字符集。
查看默认的字符集和校对规则:

mysql启动时指定的字符集和校对规则,对整个mysql服务的全局有效。
msyql指定全局字符集的方式灵活:
1. 编译安装时指定  -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_general_ci 
2. mysql服务启动时指定  --character_set_server  --collation_set_server
3. 参数文件中配置,在服务加载时生效。 character_set_server=utf8  collation_set_server=utf8_general_ci
4. 服务运行期间实时修改  set global character_set_server=utf8;   collation_set_server会跟着变为utf8_general_ci
mysql变量的作用域分为全局和会话,全局的修改,对当前会话无效,只作用于修改后新建的会话,且mysql服务重启后,全局修改失效,避免重启后失效,则修改参数文件。
客户端连接到mysql后的字符集,默认会继承mysql服务设置的字符集,也就是全局的character_set_server和collation_set_server指定的字符集和校对规则。
设置结果发给客户端的字符集: set character_set_results=gbk;  
character_set_client    客户端发出的语句所使用的字符集
character_set_connection 服务端收到客户端的语句后,将语句由character_set_client字符集转换为character_set_connection字符集
character_set_server   服务端处理的字符集
character_set_results  服务端执行语句后,将结果按照character_set_results的字符集返回到客户端。

修改客户端会话的字符集:
set names同时修改了character_set_client、character_set_connection、character_set_results

set character set相当于同时修改了character_set_client、character_set_results  不同版本不一样

utf16、utf16e、utf32不能被客户端字符集使用,也就是说不能用set names和set character set来设置这些字符集。
set names和set character set都是会话级的,如果想长期有效,一是mysql服务启动时修改系统变量,二是在客户端进行设置,使得与mysql相关的客户端命令在连接时,能够自动使用我们设定好的字符集。
mysql客户端程序,包括mysql、mysqladmin、mysqldump、mysqlimport等命令行工具,都是按照下列规则,读取连续的默认字符集设定,优先级依次递增。
默认情况下,使用编译时指定的默认字符集。
程序能够自动检测当前操作系统环境变量中设定的字符集,比如操作系统环境变量LANG或LC_ALL设定语言,因此用户也可以设定环境变量,来修改客户端连接后的默认字符集。
对于支持default_character_set选项的命令行工具,常用的命令都支持,可通过该参数设置连接后默认的字符集。可以将default_character_set变量放在my.cnf的[mysql]或 [client]区域,这样就可以同时设置多个字符集变量了。
存储数据时所用的字符集,4种粒度
1. server 全局级
2. database 库级
3. table 表级
4. column 列级
全局和库级的字符集可以任意修改,不会对现有数据造成影响,最多影响的是新增的数据,对表和列的字符集修改就要慎重了,如果不慎会丢数据的。
用alter table命令修改表或列的字符集时,如果字符集不兼容,就会丢数据,子集到超集的转换没问题,超集到子集就会丢数据。
latin1 -->gb2312 -->gbk -->utf8 这个方向的转换是安全的。
这四种级别作用域依次递减,但优先级是依次递增。
1. server 全局级的指定见上面的4条。
2. database 库级 character set n 或character  n
(system@localhost) [mysql]> create database test charset gbk;
Query OK, 1 row affected (0.02 sec)
(system@localhost) [mysql]> alter database test charset utf8;
Query OK, 1 row affected (0.00 sec)
 指定了库字符集后,库校对规则也跟着指定了。库的字符集设置,保存在库同名的操作系统目录下的db.opt文件中。
$ more /data/mysqldata/3306/data/test/db.opt 
default-character-set=utf8
default-collation=utf8_general_ci   #既有中横线也有下划线
也可以用命令查看:
(system@localhost) [(none)]> show create database test;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| test     | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
该库下所建的表默认会继承该库的字符集,甚至使用load data infile向该库下加载对象,如无明确指定,也会继承库级的字符集。
3. table 表级 

4. column 列级
所有字符类型的列,如char/varchar/text/enum/set,均可以在创建时指定字符集和校对规则,也可以通过alter table命令对字符集进行修改。
(system@localhost) [test]> set names gbk;
Query OK, 0 rows affected (0.00 sec)
(system@localhost) [test]> show variables like '%set%';
+---------------------------------------+----------------------------------+
| Variable_name                         | Value                            |
+---------------------------------------+----------------------------------+
| character_set_client                  | gbk                              |
| character_set_connection              | gbk                              |
| character_set_database                | utf8                             |
| character_set_filesystem              | binary                           |
| character_set_results                 | gbk                              |
| character_set_server                  | utf8                             |
| character_set_system                  | utf8                             |
14 rows in set (0.00 sec)
(system@localhost) [test]> insert into t3 values ('China','cn 中国','cn 中国');
Query OK, 1 row affected, 1 warning (0.01 sec)
(system@localhost) [test]> select * from t3;
+-------+-----------+----------+
| col1  | col2      | col3     |
+-------+-----------+----------+
| China | cn       | cn      |
| China | cn 中国   | cn   |
+-------+-----------+----------+
2 rows in set (0.00 sec)
(system@localhost) [test]> show warnings;
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                   |
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Error | 1064 | You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'warning' at line 1 |
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
5.6中,不管字符集如何设置,n[char/varchar/text],字符集均为utf8。
  评论这张
 
阅读(82)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018