mysql设置utf8中文乱码_【trouble-shooting】MySQL中文乱码,如何设置utf8

问题情境

create table score (

student_id int,

subject varchar(10),

subject_score int

);

insert into score values (001,'数学',50),(002,'数学',60),(003,'数学',70);

”数学“中文字符不能顺利显示

c0c59a55b3b74b2de56dbadc065eee38.png

解决问题

中文乱码,是因为MySQL现在的 ”Character Set 字符集合“ 只能识别英文字符和数字字符,不能识别”中文字符“所导致的

到底什么叫Character Set呢?

打个比方,现在有一篇文章

9760485b68702fb35e5960339e650bd0.png

我不想看文字了,我想听有声书,这时候我就需要下载语音包,我想听粤语,我就使用”粤语语音包“,想听”东北话“,就使用”东北话语音包“

dc75a4b31c62c724d5045427e98cd139.png

“character set 字符集合” 跟”语音包“ 很类似,只不过前者是”看“的,后者是”听“的

Character Set 里面到底有什么呢?

1.符号 symbols

2.编码 encoding

#查询数据库使用的字符集

mysql> SELECT @@character_set_database;

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

| @@character_set_database |

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

| latin1 |

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

1 row in set (0.00 sec)

刚才的中文乱码,就是因为正在使用的"latin1 character set"并不包含”中文符号“,所以我们需要换一个包含”中文符号“的character set,如utf8

613d4dd42c9e7ab515c2de99994834c7.png

character set有4个维度

1.列的 character set

2.表的 character set

3.数据库的 character set

4.服务器的 character set

它们之间的关系是包含于被包含

fe498176fa88ad784ac8b76bec518429.png

服务器的character set 需要在启动的时候修改,现在可以考虑在database层面修改

#查询可以选择的character set

mysql> show character set;

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

| Charset | Description | Default collation | Maxlen |

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

| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |

| dec8 | DEC West European | dec8_swedish_ci | 1 |

| cp850 | DOS West European | cp850_general_ci | 1 |

| hp8 | HP West European | hp8_english_ci | 1 |

| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |

| latin1 | cp1252 West European | latin1_swedish_ci | 1 |

| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |

| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |

| ascii | US ASCII | ascii_general_ci | 1 |

| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |

| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |

| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |

| tis620 | TIS620 Thai | tis620_thai_ci | 1 |

| euckr | EUC-KR Korean | euckr_korean_ci | 2 |

| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |

| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |

| greek | ISO 8859-7 Greek | greek_general_ci | 1 |

| cp1250 | Windows Central European | cp1250_general_ci | 1 |

| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |

| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |

| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |

| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |

| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |

| cp866 | DOS Russian | cp866_general_ci | 1 |

| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |

| macce | Mac Central European | macce_general_ci | 1 |

| macroman | Mac West European | macroman_general_ci | 1 |

| cp852 | DOS Central European | cp852_general_ci | 1 |

| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |

| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |

| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |

| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |

| cp1256 | Windows Arabic | cp1256_general_ci | 1 |

| cp1257 | Windows Baltic | cp1257_general_ci | 1 |

| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |

| binary | Binary pseudo charset | binary | 1 |

| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |

| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |

| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |

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

39 rows in set (0.00 sec)

#修改数据库编码

alter database character set utf8

#确认一下

SELECT @@character_set_database;

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

| @@character_set_database |

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

| utf8 |

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

1 row in set (0.00 sec)

efd0f7cf0bec16f3e5cb2c6234dd6669.png

再次查询,还是未能看到”中文“,那是因为table是按照latin1 character set 创建的,只有重新创建的table才会有新的utf8 character set

#查询表格的character set

mysql> show create table score;

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

| Table | Create Table |

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

| score | CREATE TABLE `score` (

`student_id` int(11) DEFAULT NULL,

`subject` varchar(10) DEFAULT NULL,

`subject_score` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

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

1 row in set (0.00 sec)

#修改表格的character set

mysql> alter table score character set utf8;

Query OK, 3 rows affected (0.01 sec)

Records: 3 Duplicates: 0 Warnings: 0

0df952b06a4423f0d19b31b56a0aff7a.png

还是不能正常显示中文字符,这时因为”column字段“,还是按照原来默认的方式创建了,column是最低的维度

mysql> show create table score;

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

| Table | Create Table |

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

| score | CREATE TABLE `score` (

`student_id` int(11) DEFAULT NULL,

`subject` varchar(10) CHARACTER SET latin1 DEFAULT NULL,

`subject_score` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

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

1 row in set (0.00 sec)

所以还需要把列的character set修改一下

mysql> alter table score modify subject varchar(10) character set utf8;

Query OK, 3 rows affected (0.04 sec)

Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from score;

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

| student_id | subject | subject_score |

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

| 1 | ?? | 50 |

| 2 | ?? | 60 |

| 3 | ?? | 70 |

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

3 rows in set (0.00 sec)

mysql> show create table score;

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

| Table | Create Table |

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

| score | CREATE TABLE `score` (

`student_id` int(11) DEFAULT NULL,

`subject` varchar(10) DEFAULT NULL,

`subject_score` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

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

1 row in set (0.00 sec)

2a38a60f58f3584f3a59d78be3e18f8f.png

继续检查

mysql> SHOW VARIABLES LIKE 'character_set%';

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

| 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 | latin1 |

| character_set_system | utf8 |

| character_sets_dir | /usr/local/mysql-5.5.47-linux2.6-x86_64/share/charsets/ |

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

8 rows in set (0.00 sec)

mysql> set character_set_server=utf8;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into score values (001,'数学',50),(002,'数学',60),(003,'数学',70);

Query OK, 3 rows affected (0.00 sec)

Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from score;

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

| student_id | subject | subject_score |

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

| 1 | ?? | 50 |

| 2 | ?? | 60 |

| 3 | ?? | 70 |

| 1 | 数学 | 50 |

| 2 | 数学 | 60 |

| 3 | 数学 | 70 |

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

才发现原来,修改字符集,只能对新的数据起作用,旧的数据不会影响的 how to save my old records? - they already damaged on insert, multibyte content was thrown away and just saved as ?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值