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;

原文地址:https://www.cnblogs.com/kaishirenshi/p/7613649.html