Chinaunix首页 | 论坛 | 博客
  • 博客访问: 448915
  • 博文数量: 173
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 1490
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-11 14:35
文章存档

2011年(9)

2010年(17)

2009年(62)

2008年(85)

我的朋友

分类: Mysql/postgreSQL

2008-09-27 12:10:41

首先要了解字符集和校验的概念,这对理解后文很重要。请查阅手册

可以使用
        mysql> SHOW CHARACTER SET;
字符集进行查看,种类繁多。

可以使用
        mysql> SHOW COLLATION LIKE 'latin1%';
对latin1字符集校验进行查看,种类同样很多,都以$1_$2_$3的形式出现,$1为使用的字符集,$2为使用国家,也可能是多国语言general,$3 一般设置为ci,cs,bin。ci是不区分大小写的,cs是大小写敏感的,bin是二原结束

设置字符集和校验分为客户端和服务器端
服务器端的字符集和校验可分为四层,高层服务器字符集和校验,次高层数据库字符集和校验,低层表字符集和校验,最低层列字符集和校验。分别以1,2,3,4代表。

1是在安装时设置好的,如果默认要改变要重新安装,但在启动mysqld的时候可以设置
     shell> mysqld --default-character-set=latin1 \
                --default-collation=latin1_swedish_ci

同时设置character_set_servercollation_server系统变量的值为上面定义的

2可以在创建时定义,也可以在以后设置
     CREATE DATABASE db_name    
          [[DEFAULT] CHARACTER SET charset_name]    
          [[DEFAULT] COLLATE collation_name] 
     ALTER DATABASE db_name    
          [[DEFAULT] CHARACTER SET charset_name]    
          [[DEFAULT] COLLATE collation_name]
     CREATE DATABASE db_name    
          DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
设置character_set_databasecollation_database变量的值,如果缺省看看手册就懂了,很简单。下面介绍的也一样

3同上
     CREATE TABLE tbl_name (column_list)    
          [DEFAULT CHARACTER SET charset_name 
          [COLLATE collation_name]] 
     ALTER TABLE tbl_name    
          [DEFAULT CHARACTER SET charset_name] 
          [COLLATE collation_name]

4同上
     col_name {CHAR | VARCHAR | TEXT} (col_length)    
          [CHARACTER SET charset_name [COLLATE collation_name]]
     CREATE TABLE Table1
     (
          column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci
     );

客户端的连接同样要设置字符集和校验,服务器需要知道,你使用的是什么字符集,服务器接到数据后要转换成什么字符集和返回什么字符集,如果需要改变可能会丢失字节。服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。服务器使用character_set_connectioncollation_connection系统变量进行转换。character_set_results变量指示服务器返回查询结果到客户端使用的字符集。

可以如下设置客户端字符集
     SET NAMES 'charset_name'
SET NAMES 'x'语句与这三个语句等价:
     mysql> SET character_set_client = x;
     mysql> SET character_set_results = x;
     mysql> SET character_set_connection = x;(
这就是为啥PHP要设置字符集的原因啦)
一直设置会很烦的,可以在my.ini里增加设置
     [mysql]
     default-character-set=utf8

在手册上还介绍了在查询时显示的设置字符集和校验character_set_connectioncollation_connection的方法不太常用,提一下,详细看手册
        SELECT _latin1'string' COLLATE latin1_danish_ci;
这是改变校验的
        SELECT K FROM t1 ORDER BY k COLLATE latin1_german2_ci;

mysql提供了用于字符集转换的函数CONVERT(),CAST()
         CONVERT(expr USING transcoding_name)
         SELECT CONVERT(latin1field USING utf8) FROM latin1table;

         CAST(character_string AS character_data_type CHARACTER SET charset_name)
         SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;

也为SHOW提供了查看数据库,表和列的字符集的方法
         mysql> SHOW CREATE DATABASE databasename;
         mysql> SHOW CREATE TABLE tablename;
         mysql> SHOW FULL COLUMNS FROM tablename\G
;\G看的比较清楚,列不多可以不加啦

上面提供了很多变量可以用SHOW查看
         mysql> SHOW VARIABLES LIKE 'character_set_client';
         mysql> SHOW VARIABLES LIKE 'character_set_system';
这句是查看mysql返回信息的字符集,默认是utf8的

MYSQL 5.1新特性:mysql分配了一直国际特有字符集,其实就是utf8啦,utf8现在是4字节变长,但在mysql他是3字节存的,所有如果用了char(10)就表示要分配30个字节,因为这是最大长度嘛。varchar是变长所以用的字节就少,但有人说char速度快。
 
 新特性就是下面类型声明是等价的:
 CHAR(10) CHARACTER SET utf8
 NATIONAL CHARACTER(10)
 NCHAR(10)

 
 下面同样:
 VARCHAR(10) CHARACTER SET utf8
 NATIONAL VARCHAR(10)
 NCHAR VARCHAR(10)
 NATIONAL CHARACTER VARYING(10)
 NATIONAL CHAR VARYING(10)

比较方便啦

阅读(666) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~