抱歉!有关修改数据库的字符集,到本篇章才刚刚提及,是因为很多概念和语句提前说没有针对性!
字符集的定义,在之前的文章中已经有详细阐述!而之前主要使用在数据表中。其中有字段级字符集语句,和表级别字符集语句。数据库字符集属于库级别字符集语句。这三个等级从第到高,范围也从小到大。
CREATE{DATABASE
SCHEMA}[IFNOTEXISTS]db_name[create_option]…create_option:[DEFAULT]{CHARACTERSET[=]charset_name
COLLATE[=]collation_name
ENCRYPTION[=]{‘Y’
‘N’}}
以上语句为,MySQL数据库建立的标准语句格式。在之前建立数据库时,CREATE{DATABASE
SCHEMA}[IFNOTEXISTS]db_name已经被我们使用到,而后面的[create_option]还没有使用到。
不要着急,我们先来建立一个数据库character_set。
案例1:建立一个character_set数据库,查看建立结果,使用命令语句查看创建数据库语句。
mysqlCREATEDATABASEIFNOTEXISTScharacter_set;QueryOK,1rowaffected(0.05sec)mysqlSHOWDATABASES;+——————–+
Database
+——————–+
information_schema
学校人员信息管理
character_set
db_school
mysql
performance_schema
student
sys
+——————–+8rowsinset(0.14sec)
创建数据库character_set,并且用SHOWDATABASES语句查看创建结果。
mysqlSHOWCREATEDATABASEcharacter_set;+—————+————————————————————————–+
Database
CreateDatabase
+—————+————————————————————————–+
character_set
CREATEDATABASEcharacter_set/*!DEFAULTCHARACTERSETlatin1*/
+—————+————————————————————————–+1rowinset(0.13sec)
使用SHOWCREATEDATABASE命令语句,查看数据库创建语句。这条命令语句第一次出现在本套笔记中。其实语句本身已经不用再多介绍了,因为之前在创建数据表的时候,已经介绍过SHOWCREATETABLE命令语句,格式是一样的,显示的结果也是一样的。
我们可以看到,显示的结果中,分为2个部分。CREATEDATABASEcharacter_set,是之前我们输入的创建数据库命令。/*!DEFAULTCHARACTERSETlatin1*/,只后的这个好像从来没有见过。不必担心,因为之前我们学习过了SHOWCREATETABLE命令语句后,猜也能猜到是什么。
对聪明的你已经能看懂,意思就是,默认的字符集设置为XXX的意思。本例子设置为:latin1字符集。
在次来会看语句格式:CREATE{DATABASE
SCHEMA}[IFNOTEXISTS]db_name[create_option]…create_option:[DEFAULT]{CHARACTERSET[=]charset_name
COLLATE[=]collation_name
ENCRYPTION[=]{‘Y’
‘N’}}
第二行中的:[DEFAULT]{CHARACTERSET[=]charset_name就瞬间看懂了吧?在建立数据库的时候,是可以指定数据库级的字符集的,如果不输入指定字符集,系统将自动为用户补上系统默认字符集。
案例2:建立一个character_set2数据库,指定数据库字符集为utf8。查看建立结果,使用命令语句查看创建数据库语句。
mysqlCREATEDATABASEcharacter_set2CHARACTERSETutf8;QueryOK,1rowaffected(0.07sec)mysqlSHOWDATABASES;+——————–+
Database
+——————–+
information_schema
学校人员信息管理
character_set
character_set2
db_school
mysql
performance_schema
student
sys
+——————–+9rowsinset(0.20sec)mysqlSHOWCREATEDATABASEcharacter_set2;+—————-+————————————————————————-+
Database
CreateDatabase
+—————-+————————————————————————-+
character_set2
CREATEDATABASEcharacter_set2/*!DEFAULTCHARACTERSETutf8*/
+—————-+————————————————————————-+1rowinset(0.08sec)
和案例1一样,我们建立一个数据库,不同的是指定了数据库的字符集,然后查看建立好的数据库,也查看建立语句。由于创建时,使用了指定字符集选项,在最后查看语句中,已经看到,指定的字符集为utf8。
继续会看数据库创建语句格式:CREATE{DATABASE
SCHEMA}[IFNOTEXISTS]db_name[create_option]…create_option:[DEFAULT]{CHARACTERSET[=]charset_name
COLLATE[=]collation_name
ENCRYPTION[=]{‘Y’
‘N’}}
第二行中的:COLLATE[=]还没有说明。我们把COLLATE这个单词无论在谷歌翻译,还是百度翻译,意思都是整理。但是官方给到的翻译意思是:“排序规则”。
之前笔者已经简单的说明过关于字符集问题,以及字符如果不设置对,将会发生无法插入中文字符的问题。可还是没有搞明白字符集是干什么的,排序规则是干什么的。
要彻底搞明白这个问题,你需要去查看有关字符集的相关资料。笔者就看过前多字,之后直接看哭了。到字的时候,感觉要吐。因为整个历史背景和发展过程还没有看完。忍辱负重呀,为了大家的时间,我看完了。。。。。之后2W多字,还有相关文章介绍等几万字。所以,你可以不要看了。
例如:一个字符集,就一个语言体系(其实是文字、字符体系)。语句分中文、英文、德文、法文等,据说全世界有多中语言。一个语言体系中,有很多方言。比如说中国中就有很多方言,北方的有东北方言,西北有甘肃方言,南方有粤语,闽南语等等。不同方言的人相互对话,对方极难听懂。字符集也有这样的情况。
也就是,在数据库或者数据表建立的时候,需要规划。使用什么字符集(什么语言体系),字符集的排序规则是什么(用什么方言沟通)明白了吗?笔者又想到当时看字符集资料的经历了,我先去吐一下。。。。。
注意:“排序规则”有的书籍中也有称为:“校验规则”的
实例3:建立一个character_set3数据库,指定数据库字符集为utf8,排序规则为:utf8_general_ci。查看建立结果,使用命令语句查看创建数据库语句。
mysqlCREATEDATABASEcharacter_set3DEFAULTCHARACTERSETutf8COLLATE=utf8_general_ci;QueryOK,1rowaffected(0.12sec)mysqlSHOWDATABASES;+——————–+
Database
+——————–+
information_schema
学校人员信息管理
character_set
character_set2
character_set3
db_school
mysql
performance_schema
student
sys
+——————–+10rowsinset(0.09sec)
查看到数据character_set3已经建立
mysqlSHOWCREATEDATABASEcharacter_set3;+—————-+————————————————————————————————–+
Database
CreateDatabase
+—————-+————————————————————————————————–+
character_set3
CREATEDATABASEcharacter_set3/*!DEFAULTCHARACTERSETutf8COLLATEutf8_estonian_ci*/
+—————-+————————————————————————————————–+1rowinset(0.12sec)
使用查看语句后,发现排序规则信息为utf8_estonian_ci。以上命令语句,在MySQL5.7.26下运行
笔者继续查阅资料,发现官方资料是这样描述的。mysqlSHOWCREATEDATABASEtest\G***************************1.row***************************Database:testCreateDatabase:CREATEDATABASE`test`/*!DEFAULTCHARACTERSETutf8mb4COLLATEutf8mb4__ai_ci*//*!DEFAULTENCRYPTION=’N’*/mysqlSHOWCREATESCHEMAtest\G***************************1.row***************************Database:testCreateDatabase:CREATEDATABASE`test`/*!DEFAULTCHARACTERSETutf8mb4COLLATEutf8mb4__ai_ci*//*!DEFAULTENCRYPTION=’N’*/
使用以上资料中的语句格式,在MySQL8.0.23系统下,无法正常显示COLLATE信息。也无法在MySQL5.7.26版本中运行。
花了不小篇幅了,我们已经搞明白CHARACTER(字符集)和COLLATE(排序规则)是什么意思?干什么用的?也搞明白以上两个如何在建立数据库时如何使用。接下来是本文的标的了,如何修改数据的字符集。
案例4:将character_set3数据库中的,字符集更改为:utf16le;排序规则更改为:utf16le_bin。并查看更改结果。
mysqlSHOWCREATEDATABASEcharacter_set3;+—————-+————————————————————————————————–+
Database
CreateDatabase
+—————-+————————————————————————————————–+
character_set3
CREATEDATABASEcharacter_set3/*!DEFAULTCHARACTERSETutf8COLLATEutf8_estonian_ci*/
+—————-+————————————————————————————————–+1rowinset(0.12sec)
查看数据库,字符集为:utf8;排序规则为:utf8_estonian_ci。
mysqlALTERDATABASEcharacter_set3DEFAULTCHARSET=utf16leCOLLATEutf16le_bin;QueryOK,1rowaffected(0.00sec)
这条语句与修改数据表语句非常接近,语句格式也雷同。有命令语句:ALTERDATABASE;之后指定需要修改的数据库名称:character_set3;DEFAULTCHARSET=XXXX来指定需要自改的字符集名称。这个格式比较特别,与之前建立数据库字符集格式DEFAULTCHARACTERSET有区别。当然CHARACTERSET[=]charset_name这样的写法是官方推荐的,也是可以的。之后的COLLATEutf16le_bin是修改排序规则。当然COLLATE[=]collation_name这样的写法是官方推荐的,也是可以的。请按自己喜好,来使用。
mysqlSHOWCREATEDATABASEcharacter_set3;+—————-+————————————————————————————————+
Database
CreateDatabase
+—————-+————————————————————————————————+
character_set3
CREATEDATABASEcharacter_set3/*!DEFAULTCHARACTERSETutf16leCOLLATEutf16le_bin*/
+—————-+————————————————————————————————+1rowinset(0.08sec)
查看修改后的数据库字符集信息。
最后!有关数据字符集的说明,这篇基本阐述完毕。实际工作中,数据库建立时,使用指定字符集情况很少。一般默认就可以,因为在数据表的创建,和字段创建中,都可以单独做指定操作。除非设计数据库有专业要求,指定或者必须是需要的字符集,才会在数据库建立之初就创建完成。
细心的你一定发现有东西没有说明!ENCRYPTION[=]{‘Y’
‘N’}good刚!这个是在MySQL8.0.16版本中引才被入的选项,定义了默认的数据库加密,该加密由在数据库中创建的表继承。允许的值为“Y”(启用加密)和“N”(禁用加密)。这个选项暂时不会用到,等遇见了,再详述。