1. 程式人生 > >mysql5.5-中文亂碼原因與解決方法

mysql5.5-中文亂碼原因與解決方法

一、出現中文亂碼的原因

1.檢視字符集

mysql> show variables like ‘%char%’; ±-------------------------±------------------------------------------+ | Variable_name | Value | ±-------------------------±------------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /application/mysql-5.6.34/share/charsets/ | ±-------------------------±------------------------------------------+

=======》》》 character_set_client 客戶端使用的字元編碼 character_set_connection 資料庫連結使用的編碼 character_set_database 資料庫使用的字元編碼 latin1字符集也是支援中文資料的,出現亂碼的原因是這裡的字元編碼沒有統一。

2.使用預設字符集建立資料庫與資料表

2.1建立資料庫

mysql> show create database liang\G *************************** 1. row *************************** Database: liang Create Database: CREATE DATABASE liang

/*!40100 DEFAULT CHARACTER SET latin1 */ 1 row in set (0.00 sec)

2.2建立資料表

mysql> show create table test01\G *************************** 1. row *************************** Table: test01 Create Table: CREATE TABLE test01 ( id int(4) NOT NULL AUTO_INCREMENT, Name char(20) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec)

2.4插入英文顯示正常

mysql> insert into test01 (name) values (“laowang”); Query OK, 1 row affected (0.01 sec) mysql> select * from test01; ±—±--------+ | id | Name | ±—±--------+ | 1 | laowang | ±—±--------+ 1 row in set (0.00 sec

2.5插入中文

mysql> insert into test01 (name) values (“老王”); Query OK, 1 row affected, 1 warning (0.01 sec)

2.6顯現亂碼

mysql> select * from test01; ±—±--------+ | id | Name | ±—±--------+ | 1 | laowang | | 2 | ?? | ±—±--------+ 2 rows in set (0.00 sec)

二、解決亂碼的方法

1.設定客戶端臨時字符集

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

mysql> insert into test01 (name) values (“老王”); Query OK, 1 row affected (0.02 sec)

mysql> select * from test01; ±—±--------+ | id | Name | ±—±--------+ | 1 | laowang | | 2 | ?? | | 3 | 老王 | ±—±--------+ 3 rows in set (0.00 sec)

2.為什麼set names latin1就解決了中文資料亂碼問題?

mysql> set names latin1; Query OK, 0 rows affected (0.00 sec) mysql> show variables like ‘%char%’; ±-------------------------±------------------------------------------+ | Variable_name | Value | ±-------------------------±------------------------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /application/mysql-5.6.34/share/charsets/ | ±-------------------------±------------------------------------------+ 8 rows in set (0.01 sec) =====》》》 輸入set names latin1後,字元編碼統一就不會出現亂碼。

3.檔案資料匯入形式

方式一: mysql> system cat /root/test.sql set names latin1; ###設定臨時字符集 insert into test01 (name) values (“小王”); mysql> source /root/test.sql###匯入 Query OK, 0 rows affected (0.00 sec) Query OK, 1 row affected (0.01 sec) mysql> select * from test01; ±—±--------+ | id | Name | ±—±--------+ | 1 | laowang | | 2 | ?? | | 3 | 老王 | | 4 | 小王 | ±—±--------+ 4 rows in set (0.00 sec)

方式二: [[email protected] ~]# cat test01.sql insert into test01 (name) values (“中王”); [[email protected] ~]# mysql -uroot -p000000 -S /data/3306/mysql.sock --default-character-set=latin1 liang </root/test01.sql mysql> select * from test01; ±—±--------+ | id | Name | ±—±--------+ | 1 | laowang | | 2 | ?? | | 3 | 老王 | | 4 | 小王 | | 5 | 中王 | ±—±--------+ 5 rows in set (0.00 sec)

4.配置檔案指定字符集

更改my.conf模組的引數 [client] default-character-set=latin1 [mysqld] character-set-server=latin1

三、統一字符集(以utf-8為例)

1.Linux系統

[[email protected] ~]# cat /etc/sysconfig/i18n LANG=zh_CN.UTF-8

2.服務端

[mysqld] character-set-server=utf8

3.客戶端

[client] default-character-set=latin1

4.庫、表

mysql> show character set;###查詢字符集對應的校對規則 使用utf8建立資料庫 mysql> create database liang_utf8 default character set utf8 collate utf8_general_ci; 表不指定則預設繼承庫的字符集