溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行mysql字符集調(diào)整的示例分析

發(fā)布時間:2021-12-30 11:02:39 來源:億速云 閱讀:146 作者:柒染 欄目:云計算

如何進(jìn)行mysql字符集調(diào)整的示例分析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

   字符集是一套符號和編碼的規(guī)則,不論是在oracle數(shù)據(jù)庫還是在mysql數(shù)據(jù)庫,都存在字符集的選擇問題。對于數(shù)據(jù)庫來說,字符集又是比較重要的,因?yàn)閿?shù)據(jù)庫存儲的數(shù)據(jù)大部分都是各種文字,字符集對于數(shù)據(jù)庫的存儲、處理性能以及數(shù)據(jù)遷移都有重要的影響。

   如果在數(shù)據(jù)庫創(chuàng)建階段沒有正確選擇字符集,那么可能在后期需要更換字符集,而字符集的更換是代價比較高的操作,也存在一定的風(fēng)險,所以我們建議在應(yīng)用開始階段,就按照需求正確的選擇合適的字符集,盡量避免后期不必要的調(diào)整。

   mysql編譯安裝時,指定字符集的方法:

./configure  --with-charset=utf8

mysql的字符集有4個級別的默認(rèn)設(shè)置:服務(wù)器級、數(shù)據(jù)庫級、表級和字段級。分別在不同的地方設(shè)置,作用也不相同。
1、服務(wù)器字符集設(shè)定,在mysql服務(wù)啟動的時候確定。
可以在my.cnf中設(shè)置:

[mysql]

### 默認(rèn)字符集為utf8

default-character-set=utf8

[mysqld]
### 默認(rèn)字符集為utf8

default-character-set=utf8

### (設(shè)定連接mysql數(shù)據(jù)庫時使用utf8編碼,以讓mysql數(shù)據(jù)庫為utf8運(yùn)行)

init_connect='SET NAMES utf8'


或者在啟動選項(xiàng)中指定:
mysqld --default-character-set=utf8

如果沒有特別的指定服務(wù)器字符集,默認(rèn)使用latin1(ISO-8859-1的別名)作為服務(wù)器字符集。上面三種設(shè)置的方式都只指定了字符集,沒有去做校對,我們可以用show variables like 'char%';命令查詢當(dāng)前服務(wù)器的字符
集和校對規(guī)則。

mysql>show variables like 'char%';

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

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

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

注:如果增加default-character-set=utf8后,MYSQL啟動報錯。可以用character_set_server=utf8來取代default-character-set=utf8,就能正常啟動了。這是因?yàn)镸YSQL不同版本識別的問題。

2、數(shù)據(jù)庫級

創(chuàng)建數(shù)據(jù)庫時指定字符集

mysql>CREATE DATABASE my_db default charset utf8 COLLATE utf8_general_ci;

#注意后面這句話 "COLLATE utf8_general_ci",大致意思是在排序時根據(jù)utf8編碼格式來排序

如果指定了數(shù)據(jù)庫編碼,那么在這個數(shù)據(jù)庫下創(chuàng)建的所有數(shù)據(jù)表的默認(rèn)字符集都會是utf8了

修改MYSQL數(shù)據(jù)庫編碼,如果是MYSQL數(shù)據(jù)庫編碼不正確,可以在MYSQL執(zhí)行如下命令:

ALTER DATABASE my_db DEFAULT CHARACTER SET utf8;  

以上命令就是將MYSQL的my_db數(shù)據(jù)庫的編碼設(shè)為utf8

3、 表級

創(chuàng)建表時指定字符集

mysql>create table my_table (name varchar(20) not null default '')type=myisam default charset utf8;

#這句話就是創(chuàng)建一個表,指定默認(rèn)字符集為utf8

修改MYSQL表的編碼:

ALTER TABLE my_table DEFAULT CHARACTER SET utf8;

以上命令就是將一個表my_table的編碼改為utf8

4、 字段級

alter table test add column address varchar(110) after stu_id;

在stu_id后增加一個字段address

alter table test add id int unsigned not Null auto_increment primary key;

修改字段的編碼:

ALTER TABLE `test` CHANGE `name` `name` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL

以上命令就是將MYSQL數(shù)據(jù)庫test表中name的字段編碼改為utf8

在命令行下插入漢字時如下代碼:

set names utf8;有時候這一句很關(guān)鍵!

insert into charset values('王達(dá)');

注意:alter修改的方法不能更新已有記錄的字符集,只是對新創(chuàng)建的表和記錄生效。對已有記錄字符集的調(diào)整,需要先將數(shù)據(jù)導(dǎo)出,經(jīng)過適當(dāng)調(diào)整后重新導(dǎo)入才可以完全修改編碼。

導(dǎo)出導(dǎo)入的字符調(diào)整方法:

導(dǎo)出表結(jié)構(gòu)

mysqldump -uroot -pmysql --default-character-set=latin1 -d  my_db> createtab.sql

手工修改createtab.sql表結(jié)構(gòu)定義中的字符集為新的字符集

1、導(dǎo)出所有記錄

mysqldump -uroot -pmysql --quick --no-create-info --extended-insert --default-character-set=latin1 --host=localhost  my_db> data.sql

2、打開data.sql,將set names latin1修改成set names utf8

:%s/latin1/utf8/g

全文替換

3、使用新的字符集創(chuàng)建新的數(shù)據(jù)庫

create database  mydata  default charset utf8;

4、創(chuàng)建表,執(zhí)行createtab.sql

mysql -uroot -pmysql mydata<creattab.sql

5、導(dǎo)入數(shù)據(jù)

mysql -uroot -pmysql mydata<data.sql

注意一點(diǎn)就是目標(biāo)字符集要大于等于源字符集,否則會丟失一部分不支持的漢字?jǐn)?shù)據(jù)。

附:舊數(shù)據(jù)升級辦法

以原來的字符集為latin1為例,升級成為utf8的字符集。原來的表: old_table (default charset=latin1),新表:new_table(default charset=utf8)。

第一步:導(dǎo)出舊數(shù)據(jù)

mysqldump --default-character-set=latin1 -hlocalhost -uroot -B my_db --tables old_table > old.sql

第二步:轉(zhuǎn)換編碼

iconv -t utf8  -f latin1 -c old.sql > new.sql

在這里,假定原來的數(shù)據(jù)默認(rèn)是latin1編碼。

第三步:導(dǎo)入

修改old.sql,增加一條sql語句: "SET NAMES utf8;",保存。

mysql -hlocalhost -uroot my_db < new.sql

大功告成!

Mysql collate規(guī)則:

*_bin: 表示的是binary case sensitive collation,也就是說是區(qū)分大小寫的
*_cs: case sensitive collation,區(qū)分大小寫
*_ci: case insensitive collation,不區(qū)分大小寫

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI