介紹mysql
不一樣的編碼格式會致使同一字符,在不一樣字符集下的編碼會不一樣。一樣同一編碼在不一樣的字符集中代碼的字符也不相同。當你的MySQL返回的字符串的編碼格式(字符集)與你的客戶工具程序使用的字符集不一樣時,就會形成亂碼。sql
MySQL中默認字符集的設置有四級:服務器級,數據庫級,表級 。最終是字段級 的字符集設置。注意前三種均爲默認設置,並不代碼你的字段最終會使用這個字符集設置。數據庫
MySQL中默認字符集的設置有四級:服務器級別 > 數據庫級別 > 表級別 > 列級別。若是後者沒有顯示指定字符集,那麼將採用前者的字符集。服務器
MySQL對於字符集的指定能夠細化到一個數據庫,一張表,一列.傳統的程序在建立數據庫和數據表時並無使用那麼複雜的配置,它們用的是默認的配置.ide
(1)、編譯MySQL 時,指定了一個默認的字符集,這個字符集是 latin1;工具
(2)、安裝MySQL 時,能夠在配置文件 (my.ini) 中指定一個默認的的字符集,若是沒指定,這個值繼承自編譯時指定的;編碼
(3)、啓動mysqld 時,能夠在命令行參數中指定一個默認的的字符集,若是沒指定,這個值繼承自配置文件中的配置,此時 character_set_server 被設定爲這個默認的字符集;spa
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| 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 | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
其中命令行
- character_set_client 客戶端來源數據使用的字符集編碼;
- character_set_connection 爲創建鏈接使用的編碼(從客戶端接收到數據,而後傳輸的字符集);
- character_set_database 默認數據庫的字符集編碼;
- character_set_filesystem 把os上文件名轉化成此字符集,即把 character_set_client轉換character_set_filesystem, 默認binary是不作任何轉換的
- character_set_results 查詢結果字符集編碼;
- character_set_server 數據庫服務器的默認字符集編碼;
- character_set_system 系統元數據(字段名等)字符集,是爲存儲系統元數據的字符集;
mysql> show variables like 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_bin |
+----------------------+-----------------+
3 rows in set (0.00 sec)
其中orm
- COLLATION_CONNECTION 當前鏈接的校對
- COLLATION_DATABASE 當前日期的默認校對。每次使用USE語句來「跳轉」到另外一個數據庫時,這個變量就會改變。
- COLLATION_SERVER 服務器默認校對
方法:show create database DatabaseName;
mysql> show create database zjtravel;
+----------+-------------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------------+
| zjtravel | CREATE DATABASE `zjtravel` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)
方法:show create table TableName;
顯示一:
mysql> show create table destination;
+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| destination | CREATE TABLE `destination` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`pid` int(10) NOT NULL DEFAULT '0',
`name` varchar(20) NOT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8 |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
顯示二:
mysql> show create table destination \G
*************************** 1. row ***************************
Table: destination
Create Table: CREATE TABLE `destination` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`pid` int(10) NOT NULL DEFAULT '0',
`name` varchar(20) NOT NULL,
`subarea` varchar(1000) DEFAULT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
顯示一:
mysql> show full columns from destination;
+------------+---------------+-----------------+------+-----+---------------------+-----------------------------+---------------------------------+--------------------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+------------+---------------+-----------------+------+-----+---------------------+-----------------------------+---------------------------------+--------------------+
| id | int(10) | NULL | NO | PRI | NULL | auto_increment | select,insert,update,references | |
| pid | int(10) | NULL | NO | MUL | 0 | | select,insert,update,references | |
| name | varchar(20) | utf8_general_ci | NO | | NULL | | select,insert,update,references | |
| subarea | varchar(1000) | utf8_general_ci | YES | | NULL | | select,insert,update,references | |
+------------+---------------+-----------------+------+-----+---------------------+-----------------------------+---------------------------------+--------------------+
4 rows in set (0.00 sec)
顯示二:
mysql> show full columns from destination \G
*************************** 1. row ***************************
Field: id
Type: int(10)
Collation: NULL
Null: NO
Key: PRI
Default: NULL
Extra: auto_increment
Privileges: select,insert,update,references
Comment:
*************************** 2. row ***************************
Field: pid
Type: int(10)
Collation: NULL
Null: NO
Key: MUL
Default: 0
Extra:
Privileges: select,insert,update,references
Comment:
*************************** 3. row ***************************
Field: name
Type: varchar(20)
Collation: utf8_general_ci
Null: NO
Key:
Default: NULL
Extra:
Privileges: select,insert,update,references
Comment:
*************************** 4. row ***************************
Field: subarea
Type: varchar(1000)
Collation: utf8_general_ci
Null: YES
Key:
Default: NULL
Extra:
Privileges: select,insert,update,references
Comment:
4 rows in set (0.00 sec)
編輯配置文件
#vi /etc/my.cnf
[mysqld]
default-character-set = utf8
character_set_server = utf8
collation-server=utf8_bin
更新編輯完成以後,重啓mysql服務器使其生效。
mysql> SET character_set_client = utf8 ;
mysql> SET character_set_connection = utf8 ;
mysql> SET character_set_database = utf8 ;
mysql> SET character_set_results = utf8 ;
mysql> SET character_set_server = utf8 ;
mysql> SET collation_connection = utf8 ;
mysql> SET collation_database = utf8 ;
mysql> SET collation_server = utf8 ;
使其快速設置成相應的字符集,但重啓以後會變成以前系統默認字符集。
設置了表的默認字符集爲utf8而且經過UTF-8編碼發送查詢,存入數據庫的仍然是亂碼。那connection鏈接層上可能出了問題。解決方法是在發送查詢前執行一下下面這句: SET NAMES 'utf8';它至關於下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;