mysql字符编码函数_字符集介绍及mysql数据库编码转换⼀、字符集介绍:
1、ASCII
ASCII是英⽂American Standard Code for Information Interchange的缩写,美国标准信息交换代码是由美国国家标准学会(American National Standard Institute , ANSI )制定的,标准的单字节字符编码⽅案,⽤于基于⽂本的数据。是基于拉丁字母的⼀套电脑编码系统。它主要⽤于显⽰现代英语和其他西欧语⾔。它是现今最通⽤的单字节编码系统,并等同于国际标准ISO/IEC 646。
ASCII 码使⽤指定的7 位或8 位⼆进制数组合来表⽰128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使⽤7 位⼆进制数来表⽰所有的⼤写和⼩写字母,数字0 到9、标点符号, 以及在美式英语中使⽤的特殊控制字符。
其中:
0~31及127(共33个)是控制字符或通信专⽤字符(其余为可显⽰字符),如控制符:LF(换⾏)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专⽤字符:SOH(⽂头)、EOT(⽂尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换⾏和回车字符。它们并没有特定的图形显⽰,但会依不同的应⽤程序,⽽对⽂本显⽰有不同的影响。
32~126(共95个)是字符(32是空格),其中48~57为0到9⼗个阿拉伯数字
65~90为26个⼤写英⽂字母,97~122号为26个⼩写英⽂字母,其余为⼀些标点符号、运算符号等。
扩展ASCII 字符是从128 到255(0x80-0xff)的字符。
2、GBK
GBK即汉字内码扩展规范,K为扩展的汉语拼⾳中“扩”字的声母。英⽂全称Chinese Internal Code Specification。GBK编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于⼀库。GB2312码是×××国家汉字信息交换⽤编码,全称《信息交换⽤汉字编码字
mysql千万级查询大约多久符集——基本集》,1980年由国家标准总局发布。基本集共收⼊汉字6763个和⾮汉字图形字符682个,通⾏于中国⼤陆。新加坡等地也使⽤此编码。GBK是对GB2312-80的扩展,也就是CP936字码表 (Code Page 936)的扩展(之前CP936和GB 2312-80⼀模⼀样)。
3、latin1
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。
ISO-8859-1
ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII⼀致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是⽂字符号。
ISO-8859-1收录的字符除ASCII收录的字符外,还包括西欧语⾔、希腊语、泰语、阿拉伯语、希伯来语对应的⽂字符号。欧元符号出现的⽐较晚,没有被收录在ISO-8859-1当中。
因为ISO-8859-1编码范围使⽤了单字节内的所有空间,在⽀持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换⾔之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性,MySQL数据库默认编码是Latin1就是利⽤了这个特性。ASCII编码是⼀个7位的容器,ISO-8859-1编码是⼀个8位的容器。
4、UTF-8
UTF-8(8-bit Unicode Transformation Format)是⼀种针对Unicode的可变长度字符编码,⼜称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8⽤1到4个字节编码UNICODE字符。⽤在⽹页上可以同⼀页⾯显⽰中⽂简体繁体及其它语⾔(如⽇⽂,韩⽂)
UTF-8以字节为单位对Unicode进⾏编码。从Unicode到UTF-8的编码⽅式如下:Unicode编码(⼗六进制)UTF-8 字节流(⼆进制)
000000 - 00007F0xxxxxxx
000080 - 0007FF110xxxxx 10xxxxxx
000800 - 00FFFF1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
UTF-8的特点是对不同范围的字符使⽤不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最⼤长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位⼆进制数字。Unicode的最⼤码位0x10FFFF也只有21位。
例1:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使⽤⽤3字节模板了:1110xxxx 10xxxxxx
10xxxxxx。将0x6C49写成⼆进制是:0110 1100 0100 1001, ⽤这个⽐特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
例2:Unicode编码0x20C30在0x010000-0x10FFFF之间,使⽤⽤4字节模板了:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。将0x20C30写成21位⼆进制数字(不⾜21位就在前⾯补0):0 0010 0000 1100 0011 0000,⽤这个⽐特流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。
⼆、MySQL字符集设置
1、系统变量:
–character_set_server:默认的内部操作字符集
–character_set_client:客户端来源数据使⽤的字符集
–character_set_connection:连接层字符集
–character_set_results:查询结果字符集
–character_set_database:当前选中数据库的默认字符集redis集架构
–character_set_filesystem:把os上⽂件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary 是不做任何转换的
–character_set_system:这个值总是utf8,不需要设置,是为存储系统元数据的字符集
–还有以collation_开头的同上⾯对应的变量,⽤来描述字符序。
在[client]下添加如下参数,影响系统变量character_set_client和character_set_connection和character_set_results
default-character-set=utf8
在[mysqld]下添加如下参数,影响系统变量character_set_server和character_set_database
default-character-set=utf8
如下三个系统变量不需要关⼼,不会影响乱码
character_set_filesystem
character_set_system
character_sets_dir
2、MySQL的字符集⽀持(Character Set Support)有两个⽅⾯:1.字符集(Character set)和排序⽅式(Collation)。
对于字符集的⽀持细化到四个层次:
服务器(server),数据库(database),数据表(table)和连接(connection)。
MySQL对于字符集的指定可以细化到⼀个数据库,⼀张表,⼀列,应该⽤什么字符集。
但是,传统的程序在创建数据库和数据表时并没有使⽤那么复杂的配置,它们⽤的是默认的配置,那么,默认的配置从何⽽来呢?
(1)编译MySQL 时,指定了⼀个默认的字符集,这个字符集是 latin1;
(2)安装MySQL 时,可以在配置⽂件 (myf) 中指定⼀个默认的的字符集,如果没指定,这个值继承
⾃编译时指定的;
(3)启动mysqld 时,可以在命令⾏参数中指定⼀个默认的的字符集,如果没指定,这个值继承⾃配置⽂件中的配置,此时
character_set_server被设定为这个默认的字符集;
(4)当创建⼀个新的数据库时,除⾮明确指定,这个数据库的字符集被缺省设定为character_set_server;
(5)当选定了⼀个数据库时,character_set_database被设定为这个数据库默认的字符集;
(6)在这个数据库⾥创建⼀张表时,表默认的字符集被设定为character_set_database,也就是这个数据库默认的字符集;
(7)当在表内设置⼀栏时,除⾮明确指定,否则此栏缺省的字符集就是表默认的字符集;
简单的总结⼀下,如果什么地⽅都不修改,那么所有的数据库的所有表的所有栏位的都⽤ latin1 存储,不过我们如果安装 MySQL,⼀般都会选择多语⾔⽀持,也就是说,安装程序会⾃动在配置⽂件中把default_character_set设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都⽤ UTF-8 存储。
2.查看默认字符集(默认情况下,mysql的字符集是latin1(ISO_8859_1)通常,查看系统的字符集和排序⽅式的设定可以通过下⾯的两条命令:
mysql> SHOW VARIABLES LIKE 'character%';+--------------------------+---------------------------------+| Variable_name            | Value                          |+--------------------------+---------------------------------+| character_set_client    | latin1                          || character_set_connection | latin1                          || character_set_database  | latin1                          ||
character_set_filesystem | binary                          || character_set_results    | latin1                          || character_set_server    | latin1                          || character_set_system    | utf8                            || character_sets_dir      | D:"mysql-
5.0.37"share"charsets" |+--------------------------+---------------------------------+mysql> SHOW VARIABLES LIKE 'collation_%';+----------------------+-----------------+| Variable_name        | Value          |+----------------------+-----------------+| collation_connection | utf8_general_ci || collation_database  | utf8_general_ci || collation_server    | utf8_general_ci |+----------------------+-----------------+
从上例中我们可以看出字符集utf8,其中默认的排序⽅式为utf8_general_ci。排序⽅式的命名规则为:字符集名字_语⾔_后缀,其中各个典型后缀的含义如下:1)_ci:不区分⼤⼩写的排序⽅式2)_cs:区
分⼤⼩写的排序⽅式3)_bin:⼆进制排序⽅式,⼤⼩⽐较将根据字符编码,不涉及⼈类语⾔,因此_bin的排序⽅式不包含⼈类语⾔
collation_connection:在配置⽂件⾥调整[client]default-character-set就可以控制这个参数
collation_server:配置⽂件⾥调整[mysqld]collation_server=utf8_general_ci,⼀定要和[mysqld]default-character-set使⽤相同字符集
collation_database:在配置⽂件⾥调整[mysqld]default-character-set就可以控制这个参数
3、MySQL中的字符集转换过程
(1). MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;
(2).进⾏内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定⽅法如下:
使⽤每个数据字段的CHARACTER SET设定值;
若上述值不存在,则使⽤对应数据表的DEFAULT CHARACTERSET设定值(MySQL扩展,⾮SQL标准);
若上述值不存在,则使⽤对应数据库的DEFAULT CHARACTERSET设定值;
模块化编程是什么若上述值不存在,则使⽤character_set_server设定值。
(3).将操作结果从内部操作字符集转换为character_set_results。
4、常见问题解析
向默认字符集为utf8的数据表插⼊utf8编码的数据前没有设置连接字符集,查询时设置连接字符集为utf8
–插⼊时根据MySQL服务器的默认设置,character_set_client、character_set_connection和character_set_results均为latin1;
–插⼊操作的数据将经过latin1=>latin1=>utf8的字符集转换过程,这⼀过程中每个插⼊的汉字都会从原始的3个字节变成6个字节保存;
–查询时的结果将经过utf8=>utf8的字符集转换过程,将保存的6个字节原封不动返回,产⽣乱码……
向默认字符集为latin1的数据表插⼊utf8编码的数据前设置了连接字符集为utf8
–插⼊时根据连接字符集设置,character_set_client、character_set_connection和character_set_results均为utf8;
–插⼊数据将经过utf8=>utf8=>latin1的字符集转换,若原始数据中含有\u0000~\u00ff范围以外的Unicode字 符,会因为⽆法在latin1字符集中表⽰⽽被转换为“?”(0×3F)符号,以后查询时不管连接字符集设置如何都⽆法恢复其内容了。
5、检测字符集问题的⼀些⼿段
SHOW CHARACTER SET;
SHOW COLLATION;
SHOW VARIABLES LIKE ‘character%’;
SHOW VARIABLES LIKE ‘collation%’;
SQL函数HEX、LENGTH、CHAR_LENGTH
SQL函数CHARSET、COLLATION
6、使⽤MySQL字符集时的建议
建⽴数据库/表和进⾏数据库操作时尽量显式指出使⽤的字符集,⽽不是依赖于MySQL的默认设置,否则MySQL升级时可能带来很⼤困扰;
数据库和连接字符集都使⽤latin1时虽然⼤部分情况下都可以解决乱码问题,但缺点是⽆法以字符为单位来进⾏SQL操作,⼀般情况下将数据库和连接字符集都置为utf8是较好的选择;
使⽤mysql C API时,初始化数据库句柄后马上⽤mysql_options设定MYSQL_SET_CHARSET_NAME属性为utf8,这样就不⽤显式地⽤ SET NAMES语句指定连接字符集,且⽤mysql_ping重连断开的长连接时也会把连接字符集重置为utf8;
对于mysql PHP API,⼀般页⾯级的PHP程序总运⾏时间较短,在连接到数据库以后显式⽤SET NAMES语句设置⼀次连接字符集即可;但当使⽤长连接时,请注意保持连接通畅并在断开重连后⽤SET NAMES语句显式重置连接字符集。
7、其他注意事项
myf中的default_character_set设置只影响mysql命令连接服务器时的连接字符集,不会对使⽤libmysqlclient库的应⽤程序产⽣任何作⽤!
对字段进⾏的SQL函数操作通常都是以内部操作字符集进⾏的,不受连接字符集设置的影响。
SQL语句中的裸字符串会受到连接字符集或introducer设置的影响,对于⽐较之类的操作可能产⽣完全不同的结果,需要⼩⼼!
三、修改mysql默认字符集
下⾯介绍下⼏个MYSQL命令:
1.show character set;或show char set;
查看数据库⽀持的所有字符集
2.status;或\s;
查看当前状态 ⾥⾯包括当然的字符集设置
3.show variables like 'char%';
查看系统字符集设置,包括所有的字符集设置
4.show table status from sqlstudy like '%countries%';
查看sqlstudy数据库中表的字符集设置
5.show full columns from countries;
查看表列的字符集设置,关键是在同⼀个表中,每列可以设置成不同的字符集
知道怎么查看字符集了,下⾯我来说下如何设置这些字符集(当然全是我这⼏天从⽹上整理的,呵呵)
1.修改服务器级
a. 临时更改:
mysql>SET GLOBAL character_set_server=utf8;
mysql菜鸟教程字符串型>企业网站建设注意事项b. 永久更改:
修改myf⽂件
>js追加数组

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。