MySQL支持多种字符集(characterset)为用户提供数据存储,同时允许与不同的排序规则进行比较。下面介绍基于MySQL5.7的字符集相关变量的使用。1、字符集和字符顺序的概念和联系在数据存储方面,MySQL提供了对不同字符集的支持。在数据比较操作中,提供了不同字符顺序的支持。MySQL提供了不同级别的设置,包括服务器级别、数据库级别、表级别和列级别,可以提供非常精确的设置。什么是字符集和字符序列?简单的说:字符集:定义了字符和字符编码。字符顺序(collat??ion):定义了字符的比较规则。例如:有四个字符:A、B、a、b,这四个字符的编码分别为A=0、B=1、a=2、b=3。这里的字符+编码构成了字符集(字符集)。2、MySQL支持的字符集和字符序列MySQL支持多种字符集和字符序列。一个字符集至少对应一个字符顺序(通常是1到多)。两个不同的字符集不能有相同的字符顺序。每个字符集都有一个默认的字符顺序。1、查看支持的字符集您可以通过以下方式查看MYSQL支持的字符集。SHOWCHARACTERSET;select*frominformation_schema.HARACTER_SETS;2。查看支持的字符序列您可以通过以下方式查看MYSQL支持的字符序列。SHOWCOLLATIONWHERECharset='utf8';SELECT*FROMinformation_schema.COLLATIONSWHERECHARACTER_SET_NAME="utf8";3、系统的字符集(character_set_system)character_set_system是元数据的字符集,即所有的元数据使用相同的字符集。试想一下,如果元数据使用不同的字符集,将很难在不同行之间显示INFORMATION_SCHEMA中的相关信息。同时,字符集必须能够支持多种语言,让不同语言的人可以用自己的语言来命名数据库、表、列。MySQL选择UTF-8作为元数据编码,并用源码修复。查看系统字符集:select@@global.character_set_system;因为很少设置,就不做具体介绍了。4、服务器的字符集和字符顺序(character_set_server/collat??ion_server)当createdatabase没有指定charset/collat??ion时,会使用character_set_server/collat??ion_server。这两个变量可以动态设置,具有会话/全局级别。在源码中character_set_server/collat??ion_server其实对应的是一个变量,因为一个collat??ion对应一个charset,所以源码中只能记录CHARSET_INFO结构的collat??ion_server。修改character_set_server时,会选择charset对应的默认collat??ion。对于其他同时有charset和collat??ion的变量,源码记录也记录了collat??ion。character_set_server和collat??ion_server分别对应服务器字符集和服务器字符顺序。1.查看character_set_server和collat??ion_server这两个系统变量分别对应的服务器字符集和字符序列。SETGLOBALSHOW_COMPATIBILITY_56=ON;SHOWVARIABLELIKE"character_set_server";SHOWVARIABLELIKE"collat??ion_server";2、启动服务时指定可以在MySQL服务启动时指定服务器字符集和字符顺序。如果不指定,默认字符顺序为latin1,latin1_swedish_cimysqld--character-set-server=latin1--collat??ion-server=latin1_swedish_ci3。除了在命令行参数中指定外,还可以在配置文件中指定配置文件,如下所示。[client]default-character-set=utf8[mysql]default-character-set=utf8[mysqld]collat??ion-server=utf8_unicode_ciinit-connect='SETNAMESutf8'character-set-server=utf84。运行时修改示例:运行时修改(重启后会失效,如果重启后想保持不变,需要写入配置文件)mysql>SETcharacter_set_server=utf8;5.指定编译时的默认字符集、字符序列character_set_server、collat??ion_server默认值,可以在MySQL编译时通过编译选项指定:cmake.-DDEFAULT_CHARSET=latin1-DDEFAULT_COLLATION=latin1_german1_ci6。实例在session中设置不同的character_set_server,使数据库默认的charset和collat??ion不同。setcharacter_set_server='utf8';createdatabased1;select*frominformation_schema.schemawhereSCHEMA_NAME='d1';setcharacter_set_server='latin1';createdatabased2;select*fromSCHEMATAwhereSCHEMA_NAME='d2';五、数据库字符集、数据库字符顺序(character_set_database/collat??ion_database)级别的字符集和字符顺序。同一个MySQL服务下的数据库可以指定不同的字符集/顺序。变量值会话级别指示当前数据库的字符集/排序规则。该变量在以后的源代码版本中可能会被修改为只读。不建议修改该值。它的全局级别变量也将在以后删除。1.设置数据的字符集/顺序在创建或修改数据库时,可以通过CHARACTERSET和COLLATE指定数据库的字符集和排序规则。-创建数据库:CREATEDATABASEdb_name[[DEFAULT]CHARACTERSETcharset_name][[DEFAULT]COLLATEcollat??ion_name]修改数据库:ALTERDATABASEdb_name[[DEFAULT]CHARACTERSETcharset_name][[DEFAULT]COLLATEcollat??ion_name]示例:创建数据库test_schema,字符集设置为utf8,默认排序在这次的规则是utf8_general_ci。CREATEDATABASE`test_schema`DEFAULTCHARACTERSETutf8;2.查看数据库的字符集/顺序查看数据库的字符集/顺序有3种方式。查看test_schema的字符集和排序规则。(需要切换默认数据库):mysql>usetest_schema;mysql>SELECT@@character_set_database,@@collat??ion_database;查看test_schema的字符集和数据库(不用切换默认数据库):mysql>SELECTSCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAMEFROMinformation_schema.SCHEMATAWHERESchema_name="test_;查看创建数据库的语句查看字符集:mysql>SHOWCREATEDATABASEtest_schema;6.表的字符集和字符顺序创建和修改表的语法如下。CREATETABLEtbl_name(column_list)[[DEFAULT]CHARACTERSETcharset_name][COLLATEcollat??ion_name]]ALTERTABLEtbl_name[[DEFAULT]CHARACTERSETcharset_name][COLLATEcollat??ion_name]1.创建表并指定字符集/字符顺序指定字符集为utf8,字符顺序为默认值。创建表`test_schema`.`test_table`(`id`INTNOTNULLCOMMENT'',PRIMARYKEY(`id`)COMMENT'')DEFAULTCHARACTERSET=utf8;2、查看表的字符集/字符顺序同理,查看表的字符集/顺序也有3种方式。方法一:通过SHOWTABLESTATUS查看表状??态。注意Collat??ion是utf8_general_ci,对应的字符集是utf8。SHOWTABLESTATUSFROMtest_schema\G;方法二:查看information_schema.TABLES信息。USEtest_schema;SELECTTABLE_COLLATIONFROMinformation_schema.TABLESWHERE方法三:通过SHOWCREATETABLE确认。SHOWCREATETABLE测试表;3.如何确定表字符集和字符顺序假设CHARACTERSET和COLLATE的值分别为charset_name和collat??ion_name。如果在创建表时:指定了charset_name和collat??ion_name,则使用charset_name和collat??ion_name。只指定charset_name,不指定collat??ion_name,则字符集使用charset_name,字符序列使用charset_name对应的默认字符序列。只指定collat??ion_name,不指定charset_name,则字符序列使用collat??ion_name,字符集使用collat??ion_name关联的字符集。如果不指定charset_name和collat??ion_name,将使用数据库的字符集和字符顺序设置。7、列的字符集,排序类型为CHAR、VARCHAR、TEXT列,可以指定字符集/字符序列,语法如下:col_name{CHAR|VARCHAR|TEXT}(col_length)[CHARACTERSETcharset_name][COLLATEcollat??ion_name]1。添加列并指定字符集/排序规则如下:(类似于创建表)mysql>ALTERTABLEtest_tableADDCOLUMNchar_columnVARCHAR(25)CHARACTERSETutf8;2。查看列的字符集/顺序mysql>SELECTCHARACTER_SET_NAME,COLLATION_NAMEFROMinformation_schema.COLUMNSWHERETABLE_SCHEMA="test_LEschema"ANDTABANDCOLUMN_NAME="char_column";+--------------------+---------------+|CHARACTER_SET_NAME|COLLATION_NAME|+--------------------+------------------+|utf8|utf8_general_ci|+-----------------+-----------------+1rowinset(0.00sec)3。columncharacterset/sortingrulesdetermined假设CHARACTERSET和COLLATE的值分别为charset_name和collat??ion_name:如果charset_name和collat??ion_name都明确了,那么字符集和字符顺序以charset_name和collat??ion_name为准。只指定charset_name,不指定collat??ion_name,则字符集为charset_name,字符序列为charset_name的默认字符序列。只指定collat??ion_name,不指定charset_name,则字符序列为collat??ion_name,字符集为collat??ion_name关联的字符集。如果不指定charset_name和collat??ion_name,则以表的字符集和字符顺序为准。
