首页
登录 | 注册

关于MySQL字符集的问题

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

可以使用
        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)

比较方便啦


相关文章

  • 解决方法一:(最重要的一种方法)你看下my.ini,有无 [mysql] default-character-set=utf8 [client] default-character-set=utf8 [mysqld] default-cha ...
  • 1.使用MyISAM而不是InnoDB MySQL有很多数据库引擎,但是你最可能碰到的就是MyISAM和InnoDB. MySQL默认使用的是MyISAM.但是,很多情况下这都是一个很糟糕的选择,除非你在创建一个非常简单抑或实验性的数据库. ...
  • 致DBA:为什么你经常犯错,是因为你做的功课不够
    专职做DBA已经6年多的事件了,看同行.同事犯了太多的错误,自己也犯了非常多的错误.一路走来,感触非常深.然而绝大多数的错误其实都是很低级的错误.有的是因为不了解某个引擎的特性导致:有的是因为对线上环境不了解导致:有的是因为经验不足导致:一 ...
  • MySQL学习分享--Thread pool
    刚刚经历了淘宝的双11,真实感受到了紧张的氛围.尽管DB淡定的度过,但是历程中的波折,可谓惊心动魄.其中MySQL在大量连接(万级)的场景下,表现出性能远远低于预期,并且出现明显的波动,成为一个非常重要的问题.问题虽然解决,但是后续的思考和 ...
  • 基于<MySQL学习分享--MySQL 5.7性能改进>文中提到的事务锁的优化,MySQL在5.6之前,trx_sys事务锁一直是影响性能的主要因素.在应用中也会经常发现系统资源利用不起来,追查的结果往往是trx_sys事务锁的 ...
  • 1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前 ...

2019 unjeep.com webmaster#unjeep.com
12 q. 0.012 s.
京ICP备10005923号