• mysql的字符集


    mysql 字符集介绍

    2017-09-30-09:16:57

    个人原创,转载请注明,否则追究法律责任

    原理:mysql -uroot -p </tmp/a.sql 就是将数据里已有的删掉,从新创建,然后执行各个mysql语句。
    所以当涉及到,插入的字符集里有中文时,一定要现在定义set names gbk;

    字符集:mysql用来存储字符串的方式。(包含字符集和校队规则)
    默认字符集:拉丁字符集
    GBK 定长,双字节,不是国际标准,支持的系统不少
    UTF-8 非定长,1-4字节,广泛支持,mysql也使用UTF-8
    latin1 mysql的默认字符集

    字符集的选择:
    1,如处理各种文字,发布到不同语言的国家(处理英文),应选Unicode,对应的mysql就是UTF-8,每个汉字三字节,
    如果应用需要处理英文,仅少量汉字,UTF-8 更好
    2,如需支持中文,数据量大,性能要求高,可选GBK(每个汉字双字节,英文也是双字节)

    实际中:2/3使用UTF-8,1/1使用GBK,mysql可以支持多种字符集
    同一台机器,库,表的不同字段都可以指定不同的字符集。建库的字符集应给和建表的字符集应该一样。应该和mysql客户端的字符集,甚至操作系统的字符集全统一,这样就正常。否则可能会出错。

    修改后的字符集变量:
    mysql> show variables like 'character_set%';
    +--------------------------+----------------------------+
    | Variable_name | Value |
    +--------------------------+----------------------------+
    | character_set_client | gbk |
    | character_set_connection | gbk |
    | character_set_database | latin1 |
    | character_set_filesystem | binary |
    | character_set_results | gbk |
    | character_set_server | latin1 |
    | character_set_system | utf8 |
    | character_sets_dir | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)

    查看表的字符集:
    mysql> show create table cc;
    +-------+-------------------------------------------------------------------------------------------+
    | Table | Create Table |
    +-------+-------------------------------------------------------------------------------------------+
    | cc | CREATE TABLE `cc` (
    `name` char(20) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
    +-------+-------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)


    建一个gbk字符集的表:
    mysql> create table dd(id int,name char(20)) default charset=gbk;
    Query OK, 0 rows affected (0.01 sec)
    mysql> set names gbk;
    Query OK, 0 rows affected (0.00 sec)

    mysql> insert into dd values(1,'abc'),(2,'性能要求高'),(3,'如需支持中文');
    Query OK, 3 rows affected, 1 warning (0.00 sec)
    Records: 3 Duplicates: 0 Warnings: 0

    mysql> select * from dd;
    +------+--------------------+
    | id | name |
    +------+--------------------+
    | 1 | abc |
    | 2 | 性能要求?? |
    | 3 | 如需支持中文 |
    +------+--------------------+
    3 rows in set (0.00 sec)

    注意:库和表的字符集要统一,要么都是utf8或者都是gbk。一般都用utf8.

    另外的方法:在/etc/my.cnf 里添加参数:
    位置为[mysqld]的下面
    default-character-set=gbk
    service mysqld restart 重启服务。
    能够修改:character_set_server和character_set_database这两个的字符集
    而set names gbk;可以修个上面两个,再加上:客户端和连接。

    生产环境的字符集设置:
    你的程序用什么字符集,则你的数据库就用什么字符集,你的表就用什么字符集,否则就会有乱码
    生产环境中常用的字符集有gbk 和utf8
    比如:用在博客和CMS等产品的数据库授权
    mysql> create databse blog default character set gbk collate gbk_chinese_ci;
    mysql> insert into c3 values(1,'的备份与恢'); -------插入时没问题,
    Query OK, 1 row affected, 1 warning (0.00 sec)

    mysql> select * from c3; --------------------------查看时会报乱码
    +------+------------+
    | id | name |
    +------+------------+
    | 1 | afdasf |
    | 1 | 的备份? | ------------------------------出现乱码
    +------+------------+
    2 rows in set (0.00 sec)
    设置字符集后在插入数据

    mysql> set names gbk; ------------------------------------ 这时固定格式:set names gbk;names是mysql的变量,不能改成其他的
    Query OK, 0 rows affected (0.00 sec)

    mysql> insert into t1 values(1,'abc'),(2,'生产环境');
    Query OK, 2 rows affected (0.00 sec)
    Records: 2 Duplicates: 0 Warnings: 0

    mysql> select * from t1;
    +------+--------------+
    | id | name |
    +------+--------------+
    | 1 | abc |
    | 2 | 生产环境 | -------------------------------------- 这里就可以了,可以显示中文了
    +------+--------------+
    2 rows in set (0.00 sec)

    注意:set names gbk;只能是在gbk的数据库里生效。在默认创建的拉丁的字符集的数据库里,这样设置无效。仍然识别不了中文

    mysql> show create database chen;
    +----------+-----------------------------------------------------------------+
    | Database | Create Database |
    +----------+-----------------------------------------------------------------+
    | chen | CREATE DATABASE `chen` /*!40100 DEFAULT CHARACTER SET latin1 */ |
    +----------+-----------------------------------------------------------------+
    1 row in set (0.00 sec)

    mysql> set names gbk;
    Query OK, 0 rows affected (0.00 sec)

    mysql> insert into cc values('abc'),('数据库就用'),('什么字符集');
    Query OK, 3 rows affected, 2 warnings (0.00 sec)
    Records: 3 Duplicates: 0 Warnings: 0
    mysql> select * from cc;
    +---------+
    | name |
    +---------+
    | abc |
    | ??????? |
    | ??????? |
    +---------+

    总结:往数据库里插入数据时,必需是先set names gbk;然后再插入,否则,插入的是乱码。插入时成功的,但显示不出来。没用。
    编辑sql语句。在第二行添加:set names gbk;
    导入外部文本到数据库中:

              1,该文本的字符集要正确:gb2312
              2, 文件里要加入:set names gbk;

  • 相关阅读:
    网易云易盾牵手百视通 助力广电领域新媒体内容安全
    理解DDoS防护本质:基于资源较量和规则过滤的智能化系统
    DDoS防护之TCP防护
    2017年内容安全十大事件盘点
    知物由学 | AI时代,那些黑客正在如何打磨他们的“利器”?(一)
    应对羊毛党的老手段不管用了,但有些公司依然有办法,他们是怎么做的?
    知物由学 | 未来安全隐患:AI的软肋——故意欺骗神经网络
    MYSQL数据库的数据完整性
    MYSQL是什么?
    python多线程实现多任务
  • 原文地址:https://www.cnblogs.com/kaishirenshi/p/7613649.html
Copyright © 2020-2023  润新知