zoukankan      html  css  js  c++  java
  • MYSQL复习笔记6-字符集

    Date: 20100101
    Auth: Jin

    参考http://blog.sina.com.cn/s/blog_9707fac301016wxm.html

     一、字符集介绍

    计算机只处理二进制代码

    字符集是一套文字符号及其编码,比较规则的集合。

    ascii 啊四克  第一个计算机字符集

    unicode UTF8 UTF16

    二、汉字及一些常见的字符集

    GB2312

    BGK :BGK在GB2312基础上进行扩充。

    GB 18030

    三、怎样选择合适的字符集

    (1),满足应用支持语言的需求,如应用于不同的国家和地区,则选择unicod字符集。MYSQL来说,就是UTF-8

    (2),如果应用中涉及已有数据的导入,要充分考虑数据库字符集对已有的数据的兼容性,已有数据是GBK,不能选择GB2312

    (3),如果数据库只需要支持中文,数据量很大,性能要求也很高,那就应该选择双向字节长编号的中文字符集,比如GBK。

    (4),如果数据库需要做大量的字符运算,如比较,排序,选择定长字符集可能更好,因为定长字符集的处理速度要比变长字符集处理速度快。

    (5),如果所有客户端程序都支持相同的字符集,应该优先选择该字符集作为数据库字符集,这样可以避免字符集转换带来的性能开销和数据损失。

    四、Mysql支持的字符集。

    1)查看可用字符集

    mysql> show charset ;

    mysql> show character set;

    mysql> show charset like 'utf%';

    默认字符集为:latin1

    2)显示所有的字符集和该字符集默认的校对规则

    mysql> use mysql;

    mysql> desc information_schema.character_sets;

    MYSQL包括字符集(character)和校对规则(COLLATION)两个概念。字符集使用来定义MYSQL存储字符串的方式,校对规则是定义了比较字符串的方式。

    字符集和校对规则是一对多的关系,

    查看校对规则

    mysql> show collation;

    mysql> show collation like 'utf%';

    mysql> show collation like 'gb%';

    +-------------------+---------+----+---------+----------+---------+

    | Collation         | Charset | Id | Default | Compiled | Sortlen |

    +-------------------+---------+----+---------+----------+---------+

    | gb2312_chinese_ci | gb2312  | 24 | Yes     | Yes      |       1 |

    | gb2312_bin        | gb2312  | 86 |         | Yes      |       1 |

    | gbk_chinese_ci    | gbk     | 28 | Yes     | Yes      |       1 |

    | gbk_bin           | gbk     | 87 |         | Yes      |       1 |

    +-------------------+---------+----+---------+----------+---------+

    _ci 大小写不敏感

    —cs 大小写敏感

    —bin 二元,比较基于字符编码的值与language无关

    五、Mysql字符集的设置

    Mysql字符集和校对规则有4个级别的默认设置、;服务器级,数据库级,表级和字段级。他们分别在不同的地方设置,作用也不相同

    (1)服务器字符集和校对规则设置

    服务器字符集和校对规则在Mysql启动时确定

    a、myc.cnf中设置

    [mysqld]

    default-character-set=utf8

    default-collation=utf8_general_ci

    ----

    default-character-set=gbk

    default-collation=gbk_chinese_ci

    5.0 /5.1版本

    5.5 版本为

    character_set_server=utf8

    b、启动选项中指定

    mysqld --default-character-set=gbk

    c、在编译时指定它

    ./configure --with-charset=gbk

    也可以在这里设置mysql只支持的字符集

    ./configure --with-charset=utf8 --with-collation=utf8_bin --with-extra-charsets=big5,ascii,gb2312,gbk,utf8,latin1

    确认

    mysql> show variables like 'character_set_server';

    mysql> show variables like 'character%';

    mysql> show variables like 'collation_server';

    mysql> status

    (2)数据库字符集和校对规则设置

    可以在创建数据库时设置,也可以在数据库创建后alter database修改

    注意:如果数据库里已存在数据,修改字符集不能修改已经存在数据的字符集。

    设置数据库字符集的规则是:

    如果设置了字符集和校对规则,在使用指定的字符集和校对规则.

    如果设置了字符集但没有设置校对规则,在使用指定的字符集和默认校对规则.

    如果没有设置字符集和校对规则,在使用服务器字符集和校对规则.

    如果不想使用默认值,建议在创建数据库时指定字符集和默认校对规则.

    a、查看服务器默认的数据库字符集和默认校对规则-全局

    mysql> show variables like 'character_set_database';

    mysql> show variables like 'collation_database';

    b、查看某一个数据的字符集和校对规则-单个

    mysql> show create database dbtest

    c、创建数据库时设置字符集和校对规则

    create database dbtest default character set utf8 collate utf8_general_ci;

    d、修改已经数据库的字符集和校对规则

    注意:如果数据库里已存在数据,修改字符集不能修改已经数据的字符集,需要其他方式才能修改原数据的字符集规则

    mysql> alter database dbtest default character set gbk collate gbk_chinese_ci;

    (3)表字符集和校对规则设置

    可以在创建表时设置,也可以在表创建后alter table修改

    注意:如果表里已存在数据,修改字符集不能修改已经存在数据的字符集,已经存在数据的字符集还是原来的字符集

    设置表字符集的规则是:

    如果设置了字符集和校对规则,在使用指定的字符集和校对规则.

    如果设置了字符集但没有设置校对规则,在使用指定的字符集和默认校对规则.

    如果没有设置字符集和校对规则,在使用数据库的字符集和校对规则.

    如果不想使用默认值,建议在创建数据库时指定字符集和默认校对规则.

    a、查看单个表的的字符集和校对规则-单个,全局的就是这个表所在的数据库的字符集和校对规则

    mysql> show create table user G

    b、在创建表时设定字符集和校对规则

    mysql> create table tbl_userinfo (

    id int(10) NOT NULL AUTO_INCREMENT,

    username varchar(25),

    dep char(15),

    PRIMARY KEY(id)

    )ENGINE=innodb default character set utf8 collate utf8_bin;   

    索引可以 id int(10) NOT NULL AUTO_INCREMENT PRIMARY KEY

    c、修改表的字符集和校对规则

    mysql> alter table tbl_userinfo default character set gbk collate gbk_chinese_ci;

    (4)列字符集和校对规则设置

    基本很少到

    5、连接字符集和校对规则

    客户端和服务器的交互操作,MYSQL提供了3个不同的参数,character_set_client,character_set_connection,character_set_results,

    分别代表,客户端,连接,返回结果的字符集。

    通常情况下这三个字符集是相同的,不会单独设置这三个参数,可以通过以下方法来设置:

    1)使用命令来设置连接的字符集和校对规则。

    mysql> set NAMES gbk;

    这种方法需要每次连接数据库后都执行该命令

    2)配置文件my.cnf设置

    [client]

    default-character-set=utf8

    #default-character-set=gbk

    3)字符串常量的字符集也是由character_set_connection参数来指定的。

    六、字符集的修改步骤

    应用于开始阶段没有正确设置字符集,在运行一段时间以后才发现存在不能满足要求需要调整,又不想丢弃这段时间的数据,那么久需要进行以下不走进行字符集修改

    mysql> show create database zabbix;

    mysql> show create table hostsG

    我们看到使用latin1字符集,我们目标

    a,把服务器的默认字符集修改uft8 ,校对规则修改utf8_general_ci,设置字符集为utf8后默认校对规则就为utf8_general_ci

    b、修改zabbix数据库,并且将原来的数据修改为utf8

    1)、导出数据表结构,

    #mysqldump -uroot -pdiege --default-character-set=utf8 -d zabbix > create_zabbix_database.sql

    --default-character-set=utf8 表示以什么字符集连接

    -d 表示只导出表结构

    2、手动修改create_zabbix_database.sql中定义的字符集为新的字符集

    #vim create_zabbix_database.sql

    :%s/latin1/utf8/g

    3、确保记录不再更新,导出所有记录

    #mysqldump -uroot -pdiege --lock-all-tables --quick --no-create-info --extended-insert --default-character-set=latin1 zabbix > zabbix_data.sql

    --lock-all-tables 锁住所有的表

    --quick  用于转储大的表。强制mysqldump从服务器一次一行地检索表中的行而不是检索所有行,并输出前将它缓存到内存中,。

    --no-create-info 不写创建表结构的语句

    --extended-insert 使用包括几个VALUES列表的多行INSERT语法,这样转储文件更小,重载文件时可以加速插入

    --default-character-set=latin1  按原有字符集导出数据。

    4、打开zabbix_data.sql将 SET NAMEs latin1修改为SET NAMES utf8

    数据里没有

    5、删除原来的zabbix数据库

    mysql> drop database zabbix;

    6、关闭myslq服务

    #/usr/local/etc/rc.d/mysql-server stop

    7、修改配置文件/etc/my.cnf 设置默认字符集为utf8

    #vim /etc/my.cnf

    [client]

    default-character-set=utf8

    [mysqld]

    default-character-set=utf8

    default-collation=utf8_general_ci

    8、启动myslq服务

    #/usr/local/etc/rc.d/mysql-server start

    无法启动报错 LOG

    110910 21:23:21  InnoDB: Waiting for the background threads to start

    110910 21:23:22 InnoDB: 1.1.8 started; log sequence number 107574105664

    110910 21:23:22 [ERROR] /usr/local/libexec/mysqld: unknown variable 'default-character-set=utf8'

    default-character-set这个参数名在最新的MySQL5.5.8中似乎是无效的。

    MYSQL 5.5修改了字符集设置参数

    应该改成:

    character_set_server=utf8

    重新修改配置文件启动

    character_set_server=utf8

    collation_set_server=utf8_general_ci 这个也错误

    9、连接mysql测试服务器默认字符集改动是否成功

    mysql>  show variables like 'character_set_server';

    +----------------------+-------+

    | Variable_name        | Value |

    +----------------------+-------+

    | character_set_server | utf8  |

    +----------------------+-------+

    1 row in set (0.00 sec)

    mysql> show variables like 'collation_server';

    +------------------+-----------------+

    | Variable_name    | Value           |

    +------------------+-----------------+

    | collation_server | utf8_general_ci |

    +------------------+-----------------+

    1 row in set (0.00 sec)

    创建一个数据测试

    mysql> create database tech;

    Query OK, 1 row affected (0.00 sec)

    mysql> show create database tech;

    +----------+---------------------------------------------------------------+

    | Database | Create Database                                               |

    +----------+---------------------------------------------------------------+

    | tech     | CREATE DATABASE `tech` /*!40100 DEFAULT CHARACTER SET utf8 */ |

    +----------+---------------------------------------------------------------+

    1 row in set (0.00 sec)

    10、创建zabbix 数据库

    mysql> create database zabbix default character set utf8;

    11、导入数据结构

    #mysql -uroot -pdiege zabbix < create_zabbix_database.sql

    验证

    mysql> show create table users G

    12、导入数据

    mysql> use zabbix

    mysql> source /data/backup/db/20110910/zabbix_data.sql

    13、开启zabbix测试

  • 相关阅读:
    synchronized使用及java中的原子性问题
    Volatile 原理及使用,java并发中的可见性问题
    final 修饰符
    java 常见OPTS参数的含义
    Redis面试题
    Count(1),Count(*),Count(column)区别
    Mysql索引创建及删除
    springboot 非端口模式启动
    sql批量插入缓慢
    sql server sql语句导入数据到execl2007中
  • 原文地址:https://www.cnblogs.com/diege/p/3538885.html
Copyright © 2011-2022 走看看