zoukankan      html  css  js  c++  java
  • mysql学习之-字符集选定,修改。

    环境:5.6

    基础概念:

    字符(Character)是指人类语言中最小的表义符号。例如’A'、’B'等;
    编码(Encoding)是指给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符.例如,我们给字符’A'赋予数值0,给字符’B'赋予数值1,则0就是字符’A'的编码;
    字符集(Character Set)是指字符和编码对组成的集合。
    字符序(Collation)是指在同一字符集内字符之间的比较规则。
    MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的;

    mysql> show variables like 'character%'; --查看MySQL字符集设置 MySQL字符集设置
    +--------------------------+----------------------------+
    | Variable_name | Value | ? 系统变量:
    +--------------------------+----------------------------+
    | character_set_client | utf8 | – character_set_client:客户端来源数据使用的字符集
    | character_set_connection | utf8 | – character_set_connection:连接层字符集
    | character_set_database | latin1 | – character_set_database:当前选中数据库的默认字符集
    | character_set_filesystem | binary | – character_set_filesystem:文件系统字符集
    | character_set_results | utf8 | – character_set_results:查询结果字符集
    | character_set_server | latin1 | – character_set_server:内部操作字符集(服务器的字符集)
    | character_set_system | utf8 | – character_set_system:系统元数据(字段名等)字符集
    | character_sets_dir | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)

    详细解释:
    1.
    服务器(数据)端的字符集和collation,可以分成四级逐层指定——server, database, table, column。当MySQL存取位于某一列(column)的数据时,如果column的字符集和collation没有指定,就会向上追溯table的;如果table也没有指定字符集和collation,就以database的字符集和collation作为默认值;如果database仍旧没有指定,那么就以服务器的字符集和collation作为默认值。

    2.
    server的字符集和collation的默认值又是从哪里来的呢?答案是,配置文件(my.ini)和mysqld(或者mysqld-nt)的命令行参数中都可以指定。如果不幸的,你根本没有在my.ini或者命令行中指定,那么MySQL就会使用编译MySQL时指定的默认字符集——latin1。

    3.
    数据字符集转换过程:
    character_set_client->character_set_connection->character_set_(column,table,database,server)->character_set_results

    MySQL默认字符集
    MySQL对于字符集的指定可以细化到一个数据库,一张表,一列.传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置.
    (1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
    (2)安装MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
    (3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
    (4)安装 MySQL选择多语言支持,安装程序会自动在配置文件中把default_character_set 设置为 UTF-8,保证缺省情况下所有的数据库所有表的所有列的都用 UTF-8 存储。

    mysql> create database demo; --创建数据库未指定字符集,使用默认字符集创建数据库
    Query OK, 1 row affected (0.00 sec)

    mysql> show databases;
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | demo |
    | mysql |
    | performance_schema |
    | test |
    +--------------------+
    5 rows in set (0.00 sec)

    mysql> show create database demo G; --查看创建数据库时使用的什么字符集。
    *************************** 1. row ***************************
    Database: demo
    Create Database: CREATE DATABASE `demo` /*!40100 DEFAULT CHARACTER SET latin1 */
    1 row in set (0.00 sec)

    ERROR:
    No query specified

    mysql> create database demo default character set gbk collate gbk_chinese_ci; --指定字符集创建数据库
    Query OK, 1 row affected (0.00 sec)
    mysql> show create database demo;
    +----------+--------------------------------------------------------------+
    | Database | Create Database |
    +----------+--------------------------------------------------------------+
    | demo | CREATE DATABASE `demo` /*!40100 DEFAULT CHARACTER SET gbk */ |
    +----------+--------------------------------------------------------------+
    1 row in set (0.00 sec)

    mysql> create database demo2 default character set utf8 collate utf8_general_ci; --指定字符集创建数据库
    Query OK, 1 row affected (0.00 sec)

    修改字符集 :

    方法一:(永久生效)
    1.查找/etc目录下是否有my.cnf文件;
    #ls -l | grep my.cnf (在/etc下查找是否有my.cnf文件存在)
    2.如果没有就要从/usr/share/mysql,拷贝一个到/etc 下,在/usr/share/mysql目录下有五个后缀为.cnf的文件,分别是 my-huge.cnf my-innodb-heavy-4G.cnf my-large.cnf my-medium.cnf my-small.cnf ;从中随便拷贝一个到/etc目录下并将其改为my.cnf文件,我选择的是my-medium.cnf :
    #cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
    3.修改my.cnf文件,在该文件中的两个地方加上 default-character-set=utf8([client] [mysql])、
    在 [mysqld] 中添加character-set-server=utf8

    范例(红色为添加部分):
    [mysqld]
    character-set-server=utf8
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    [mysql] (注意是小写,博客问题格式有问题)
    default-character-set=utf8
    [client]
    default-character-set=utf8

    验证:查看数据库字符集
    mysql> show variables like 'character%';
    +--------------------------+----------------------------+
    | Variable_name | Value |
    +--------------------------+----------------------------+
    | character_set_client | utf8 |
    | character_set_connection | utf8 |
    | character_set_database | utf8 |
    | character_set_filesystem | binary |
    | character_set_results | utf8 |
    | character_set_server | utf8 |
    | character_set_system | utf8 |
    | character_sets_dir | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    成功!

    方法二: (临时生效)
    通过MySQL命令行修改:

    mysql> set character_set_client=utf8;
    Query OK, 0 rows affected (0.00 sec)

    mysql> set character_set_connection=utf8;
    Query OK, 0 rows affected (0.00 sec)

    mysql> set character_set_database=utf8;
    Query OK, 0 rows affected (0.00 sec)

    mysql> set character_set_results=utf8;
    Query OK, 0 rows affected (0.00 sec)

    mysql> set character_set_server=utf8;
    Query OK, 0 rows affected (0.00 sec)

    mysql> set character_set_system=utf8;
    Query OK, 0 rows affected (0.01 sec)

    mysql> set collation_connection=utf8;
    Query OK, 0 rows affected (0.01 sec)

    mysql> set collation_database=utf8;
    Query OK, 0 rows affected (0.01 sec)

    mysql> set collation_server=utf8;
    Query OK, 0 rows affected (0.01 sec)

    总结:
    1. 如果安装mysql时未指定数据库字符集,则默认数据库字符集为 latin1 。
    2. 选定数据库字符集时需要根据开发程序选定字符集。

  • 相关阅读:
    Weblogic 漏洞利用总结
    CVE-2017-9993 FFMpeg漏洞利用
    tomcat漏洞利用总结
    移动渗透测试杂记
    CORS漏洞利用检测和利用方式
    discuz mlv3.x命令注入
    DNS域传输漏洞利用总结
    redis未授权漏洞和主从复制rce漏洞利用
    CVE-2016-3714-ImageMagick 漏洞利用
    JAVA WEB EL表达式注入
  • 原文地址:https://www.cnblogs.com/andy6/p/6185273.html
Copyright © 2011-2022 走看看