zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    215. Kth Largest Element in an Array
    214. Shortest Palindrome
    213. House Robber II
    212. Word Search II
    210 Course ScheduleII
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    206. Reverse Linked List
    sql 开发经验
  • 原文地址:https://www.cnblogs.com/kaishirenshi/p/7613649.html
Copyright © 2011-2022 走看看