mysql不能改编码_(转)MySQL设置和修改编码问题
mysql版本:5.7.18
一、常用查看字符集設(shè)定命令
1、查看數(shù)據(jù)庫(kù)支持的所有字符集。
show character set;
(或 show char set;)
2、查看當(dāng)前狀態(tài)命令(顯示結(jié)果會(huì)包含數(shù)據(jù)庫(kù)的字符集設(shè)置)
status(或 /s)
其中Db characterset對(duì)應(yīng)的是數(shù)據(jù)庫(kù)目錄下的db.opt文件內(nèi)容。(查到mysql安裝目錄下有4個(gè)db.opt文件,與顯示相同的在mysql/data/mysql路徑下)。
3、查看系統(tǒng)字符集設(shè)置(包括所有的字符集設(shè)置)
show variables like '%char%';
其中的含義如下:
條目說(shuō)明
character_set_client
為客戶端使用的字符集。
character_set_connection
為連接數(shù)據(jù)庫(kù)的字符集設(shè)置類型,如果程序沒(méi)有指明連接數(shù)據(jù)庫(kù)使用的字符集類型則按照服務(wù)器端默認(rèn)的字符集設(shè)置。
character_set_database
為數(shù)據(jù)庫(kù)服務(wù)器中某個(gè)庫(kù)使用的字符集設(shè)定,如果建庫(kù)時(shí)沒(méi)有指明,將使用服務(wù)器安裝時(shí)指定的字符集設(shè)置。
character_set_results
為數(shù)據(jù)庫(kù)給客戶端返回時(shí)使用的字符集設(shè)定,如果沒(méi)有指明,使用服務(wù)器默認(rèn)的字符集。
character_set_server
為服務(wù)器安裝時(shí)指定的默認(rèn)字符集設(shè)定。
character_set_system
為數(shù)據(jù)庫(kù)系統(tǒng)使用的字符集設(shè)定。
當(dāng)客戶端連接服務(wù)器的時(shí)候,它會(huì)將自己想要的字符集名稱發(fā)送給mysql服務(wù)器,然后服務(wù)器就會(huì)使用這個(gè)字符集去設(shè)置 character_set_connection、character_set_client、character_set_results這三個(gè)值。
在cmd客戶端使用GBK字符集,上圖client、connection、results的值為GBK。
在Navicat for Mysql中運(yùn)行命令,顯示值為utf-8。
4、查看具體的數(shù)據(jù)庫(kù)表的字符集設(shè)置
show full columns from tablename;
(或show create table tablename\G;
注:\G在cmd中可以去除打印的表格邊框,在Navicat for Mysql中命令有\(zhòng)G會(huì)報(bào)錯(cuò)。)
5、查看數(shù)據(jù)庫(kù)編碼
show create database dbname;
二、創(chuàng)建時(shí)指定字符集
知道了怎么查找字符集的相關(guān)信息之后,我們就要懂得怎么在創(chuàng)建指定對(duì)象的時(shí)候,為該對(duì)象匹配相應(yīng)的字符集。
1、服務(wù)器級(jí)
在安裝MySQL時(shí),可以設(shè)置服務(wù)器的默認(rèn)編碼格式,也可對(duì) my.ini做修改,修改[mysqld]里面的character_set_server=utf8,則可設(shè)置character_set_server的值。
2、數(shù)據(jù)庫(kù)級(jí)
CREATE DATABASE db_name DEFAULT CHARACTER SET utf8;
注:如果不指定默認(rèn)的字符集,則系統(tǒng)會(huì)根據(jù)character_set_database的值進(jìn)行設(shè)置。
3、表級(jí)
CREATE TABLE `db_name`.`tb_name` (id VARCHAR(20) NOT NULL,name VARCHAR(20) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在創(chuàng)建表時(shí)指定了默認(rèn)字符集為utf8,即使character_set_database為gbk,表的列都為utf-8。
但要注意,如果沒(méi)有定義表的默認(rèn)字符集,則會(huì)按照character_set_database的值來(lái)設(shè)置。(試了一下應(yīng)該是按照表所屬的數(shù)據(jù)庫(kù)字符集來(lái)設(shè)置吧)。
4、列級(jí)
CREATE TABLE `db_name`.`tb_name` ( id varchar(20) NOT NULL, name varchar(20) CHARACTER SET utf8 );
三、修改字符集命令
MySQL的字符集問(wèn)題主要是兩個(gè)概念,一個(gè)是Character Sets,一個(gè)是Collations,前者是字符內(nèi)容
及編碼,后者是對(duì)前者進(jìn)行比較操作的一些規(guī)則。這兩個(gè)參數(shù)集可以在數(shù)據(jù)庫(kù)實(shí)例、單個(gè)數(shù)據(jù)庫(kù)、表、列等四個(gè)級(jí)
別指定。
1、修改character_set_connection、character_set_client、character_set_results三值
SET NAMES charset_name [COLLATE 'collation_name']
(例:SET NAMES utf8;)
該命令相當(dāng)于
SET character_set_client = charset_name; SET character_set_results = charset_name; SET character_set_connection = charset_name;
另外,還可以修改配置文件my.ini,對(duì)[mysql]下增加 default-character-set=utf8,配置成你想要的字符集(個(gè)人嘗試在my.ini里面配置過(guò),沒(méi)有成效,不知道是不是被使用的客戶端想要的字符集給覆蓋掉了呢?)
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字段
最簡(jiǎn)單的方法是直接改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字符集設(shè)置
MySQL的字符集問(wèn)題主要是兩個(gè)概念,一個(gè)是Character Sets,一個(gè)是Collations,前者是字符內(nèi)容及編碼,后者是對(duì)前者進(jìn)行比較操作的一些規(guī)則。這兩個(gè)參數(shù)集可以在數(shù)據(jù)庫(kù)實(shí)例、單個(gè)數(shù)據(jù)庫(kù)、表、列等四個(gè)級(jí)別指定。
對(duì)于使用者來(lái)說(shuō),一般推薦使用utf8編碼來(lái)存儲(chǔ)數(shù)據(jù)。而要解決亂碼問(wèn)題,不單單是MySQL數(shù)據(jù)的存儲(chǔ)問(wèn)題,還和用戶的程序文件的編碼方式、用戶程序和MySQL數(shù)據(jù)庫(kù)的連接方式都有關(guān)系。
首先,MySQL有默認(rèn)的字符集,這個(gè)是安裝的時(shí)候確定的,在編譯MySQL的時(shí)候可以通過(guò)DEFAULT_CHARSET=utf8和DEFAULT_COLLATION=utf8_general_ci這兩個(gè)參數(shù)(MySQL5.5版本,5.1版本用–with-charset=utf8 –with-collation=utf8_general_ci)來(lái)指定默認(rèn)的字符集為utf8,這也是最一勞永逸的辦法,這樣指定后,客戶端連接到數(shù)據(jù)庫(kù)的編碼方式也默認(rèn)是utf8了,應(yīng)用程序不需要任何處理。
但是遺憾的是,很多人編譯安裝MySQL的時(shí)候沒(méi)有指定這兩個(gè)參數(shù),大多數(shù)人更是通過(guò)二進(jìn)制程序的方式安裝,那么這時(shí)候MySQL的默認(rèn)字符集是latin1。而這時(shí)候我們?nèi)匀豢梢灾付∕ySQL的默認(rèn)字符集,通過(guò)my.cnf文件增加兩個(gè)參數(shù):
在[mysqld]下添加default-character-set=utf8(mysql 5.5 版本添加character-set-server=utf8);
在[client]下添加default-character-set=utf8。
這樣我們建數(shù)據(jù)庫(kù)建表的時(shí)候就不用特別指定utf8的字符集了。配置文件里的這種寫法解決了數(shù)據(jù)存儲(chǔ)和比較的問(wèn)題,但是對(duì)客戶端的連接是沒(méi)有作用的,客戶端這時(shí)候一般需要指定utf8方式連接才能避免亂碼。也就是傳說(shuō)總的set names命令。事實(shí)上,set names utf8命令對(duì)應(yīng)的是服務(wù)器端以下幾個(gè)命令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
但這三個(gè)參數(shù)是不能寫在配置文件my.cnf里的。只能通過(guò)set命令來(lái)動(dòng)態(tài)修改。我們需要的是在配置文件里寫好一勞永逸的辦法。那么這時(shí)候,是否有在服務(wù)端解決問(wèn)題的辦法呢,可行的思路是在init_connect里設(shè)置。這個(gè)命令在每個(gè)普通用戶連接上來(lái)的時(shí)候都會(huì)觸發(fā)執(zhí)行,可以在[mysqld]部分增加以下一行設(shè)置連接字符集:
在[mysqld]下添加:
init_connect = 'SET NAMES utf8'
總結(jié):
1、首選在編譯安裝MySQL的時(shí)候指定兩個(gè)參數(shù)使用utf8編碼。
2、次選在配置文件my.cnf或my.ini設(shè)定兩個(gè)參數(shù),同時(shí)設(shè)置init_connect參數(shù)。
3、第三在配置文件my.cnf或my.ini設(shè)定兩個(gè)參數(shù),同時(shí)客戶端的連接指定set names命令。
4、在配置文件my.cnf里的client和server處加入default-character-set參數(shù)方便管理。
總結(jié)
以上是生活随笔為你收集整理的mysql不能改编码_(转)MySQL设置和修改编码问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基站 代码
- 下一篇: 创建二级索引_Mysql创建索引