(轉)MySQL設置和修改編碼問題

mysql版本:5.7.18

一、常用查看字符集設定命令

1、查看數據庫支持的所有字符集。

show character set;
(或 show char set;)

2、查看當前狀態命令(顯示結果會包含數據庫的字符集設置)

status(或 /s)

這裏寫圖片描述
其中Db characterset對應的是數據庫目錄下的db.opt文件內容。(查到mysql安裝目錄下有4個db.opt文件,與顯示相同的在mysql/data/mysql路徑下)。
這裏寫圖片描述

3、查看系統字符集設置(包括所有的字符集設置)

show variables like '%char%';

這裏寫圖片描述
其中的含義如下:

條目 說明
character_set_client 爲客戶端使用的字符集。
character_set_connection 爲連接數據庫的字符集設置類型,如果程序沒有指明連接數據庫使用的字符集類型則按照服務器端默認的字符集設置。
character_set_database 爲數據庫服務器中某個庫使用的字符集設定,如果建庫時沒有指明,將使用服務器安裝時指定的字符集設置。
character_set_results 爲數據庫給客戶端返回時使用的字符集設定,如果沒有指明,使用服務器默認的字符集。
character_set_server 爲服務器安裝時指定的默認字符集設定。
character_set_system 爲數據庫系統使用的字符集設定。


當客戶端連接服務器的時候,它會將自己想要的字符集名稱發送給mysql服務器,然後服務器就會使用這個字符集去設置 character_set_connection、character_set_client、character_set_results這三個值。

在cmd客戶端使用GBK字符集,上圖client、connection、results的值爲GBK。
在Navicat for Mysql中運行命令,顯示值爲utf-8。
這裏寫圖片描述

4、查看具體的數據庫表的字符集設置

show full columns from tablename;
(或show create table tablename\G;
注:\G在cmd中可以去除打印的表格邊框,在Navicat for Mysql中命令有\G會報錯。)

5、查看數據庫編碼

show create database dbname;

二、創建時指定字符集

知道了怎麼查找字符集的相關信息之後,我們就要懂得怎麼在創建指定對象的時候,爲該對象匹配相應的字符集。

1、服務器級

在安裝MySQL時,可以設置服務器的默認編碼格式,也可對 my.ini做修改,修改[mysqld]裏面的character_set_server=utf8,則可設置character_set_server的值。

2、數據庫級

CREATE DATABASE db_name DEFAULT CHARACTER SET utf8;

注:如果不指定默認的字符集,則系統會根據character_set_database的值進行設置。
這裏寫圖片描述

3、表級

CREATE TABLE  `db_name`.`tb_name` (id VARCHAR(20) NOT NULL,name VARCHAR(20) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在創建表時指定了默認字符集爲utf8,即使character_set_database爲gbk,表的列都爲utf-8。
但要注意,如果沒有定義表的默認字符集,則會按照character_set_database的值來設置。(試了一下應該是按照表所屬的數據庫字符集來設置吧)。

4、列級

CREATE TABLE  `db_name`.`tb_name` (   id varchar(20) NOT NULL,   name varchar(20) CHARACTER SET utf8 );

三、修改字符集命令

MySQL的字符集問題主要是兩個概念,一個是Character Sets,一個是Collations,前者是字符內容
及編碼,後者是對前者進行比較操作的一些規則。這兩個參數集可以在數據庫實例、單個數據庫、表、列等四個級
別指定。

1、修改character_set_connection、character_set_client、character_set_results三值

SET NAMES charset_name [COLLATE 'collation_name']
(例:SET NAMES utf8;)
該命令相當於
SET character_set_client = charset_name; SET character_set_results = charset_name; SET character_set_connection = charset_name;

另外,還可以修改配置文件my.ini,對[mysql]下增加 default-character-set=utf8,配置成你想要的字符集(個人嘗試在my.ini裏面配置過,沒有成效,不知道是不是被使用的客戶端想要的字符集給覆蓋掉了呢?)

2、修改character_set_database字段

ALTER DATABASE db_name     [[DEFAULT] CHARACTER SET charset_name]     [[DEFAULT] COLLATE collation_name]
(例:alter database test_database character set latin2;

3、修改character_set_server字段

最簡單的方法是直接改my.ini配置文件裏面[mysqld]的字段,增加character-set-server=gbk,然後重啓mysqld,則可改爲你想要的字符集。

4、修改表的字符集

ALTER TABLE tbl_name     [[DEFAULT] CHARACTER SET charset_name]     [COLLATE collation_name]
(例:ALTER table hahaha CHARACTER set gbk)

5、修改列的字符集

col_name {CHAR | VARCHAR | TEXT} (col_length)     [CHARACTER SET charset_name]     [COLLATE collation_name]
(例:ALTER TABLE t1 MODIFY     col1 VARCHAR(5)       CHARACTER SET latin1       COLLATE latin1_swedish_ci;

四、附 Linux下MySQL字符集設置

MySQL的字符集問題主要是兩個概念,一個是Character Sets,一個是Collations,前者是字符內容及編碼,後者是對前者進行比較操作的一些規則。這兩個參數集可以在數據庫實例、單個數據庫、表、列等四個級別指定。

對於使用者來說,一般推薦使用utf8編碼來存儲數據。而要解決亂碼問題,不單單是MySQL數據的存儲問題,還和用戶的程序文件的編碼方式、用戶程序和MySQL數據庫的連接方式都有關係。

首先,MySQL有默認的字符集,這個是安裝的時候確定的,在編譯MySQL的時候可以通過DEFAULT_CHARSET=utf8和DEFAULT_COLLATION=utf8_general_ci這兩個參數(MySQL5.5版本,5.1版本用–with-charset=utf8 –with-collation=utf8_general_ci)來指定默認的字符集爲utf8,這也是最一勞永逸的辦法,這樣指定後,客戶端連接到數據庫的編碼方式也默認是utf8了,應用程序不需要任何處理。

但是遺憾的是,很多人編譯安裝MySQL的時候沒有指定這兩個參數,大多數人更是通過二進制程序的方式安裝,那麼這時候MySQL的默認字符集是latin1。而這時候我們仍然可以指定MySQL的默認字符集,通過my.cnf文件增加兩個參數:

  • 在[mysqld]下添加default-character-set=utf8(mysql 5.5 版本添加character-set-server=utf8);
  • 在[client]下添加default-character-set=utf8。

這樣我們建數據庫建表的時候就不用特別指定utf8的字符集了。配置文件裏的這種寫法解決了數據存儲和比較的問題,但是對客戶端的連接是沒有作用的,客戶端這時候一般需要指定utf8方式連接才能避免亂碼。也就是傳說總的set names命令。事實上,set names utf8命令對應的是服務器端以下幾個命令:

SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

但這三個參數是不能寫在配置文件my.cnf裏的。只能通過set命令來動態修改。我們需要的是在配置文件裏寫好一勞永逸的辦法。那麼這時候,是否有在服務端解決問題的辦法呢,可行的思路是在init_connect裏設置。這個命令在每個普通用戶連接上來的時候都會觸發執行,可以在[mysqld]部分增加以下一行設置連接字符集:

在[mysqld]下添加:
  init_connect = 'SET NAMES utf8'

總結:
1、首選在編譯安裝MySQL的時候指定兩個參數使用utf8編碼。
2、次選在配置文件my.cnf或my.ini設定兩個參數,同時設置init_connect參數。
3、第三在配置文件my.cnf或my.ini設定兩個參數,同時客戶端的連接指定set names命令。
4、在配置文件my.cnf裏的client和server處加入default-character-set參數方便管理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章