• 字符(Character)是指人类语言中最小的表义符号。例如’A‘、’B‘等;
• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符’A‘赋予数值0,给字符’B‘赋予数值1,则0就是字符’A‘的编码;
• 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)。例如,给定字符列表为{‘A’,‘B’}时,{‘A’=>0, ‘B’=>1}就是一个字符集;
• 字符序(Collation)是指在同一字符集内字符之间的比较规则;
• 确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系;
• 每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序(Default Collation);
• MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的;
MySQL字符集设置• 系统变量:
– character_set_server:默认的内部操作字符集
– character_set_client:客户端来源数据使用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前选中数据库的默认字符集
– character_set_system:系统元数据(字段名等)字符集
– 还有以collation_开头的同上面对应的变量,用来描述字符序。
• 用introducer指定文本字符串的字符集:
– 格式为:[_charset] ‘string’ [COLLATE collation]
– 例如:
• SELECT _latin1 ‘string’;
• SELECT _utf8 ‘你好’ COLLATE utf8_general_ci;
– 由introducer修饰的文本字符串在请求过程中不经过多余的转码,直接转换为内部字符集处理。
MySQL中的字符集转换过程1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;
2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:
• 使用每个数据字段的CHARACTER SET设定值;
• 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准);
• 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;
• 若上述值不存在,则使用character_set_server设定值。
3. 将操作结果从内部操作字符集转换为character_set_results。
常见问题解析• 向默认字符集为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字符集中表示而被转换为“?”(0x3F)符号,以后查询时不管连接字符集设置如何都无法恢复其内容了。
检测字符集问题的一些手段• SHOW CHARACTER SET;
• SHOW COLLATION;
• SHOW VARIABLES LIKE ‘character%’;
• SHOW VARIABLES LIKE ‘collation%’;
• SQL函数HEX、LENGTH、CHAR_LENGTH
• SQL函数CHARSET、COLLATION
使用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语句显式重置连接字符集。
其他注意事项• my.cnf中的default_character_set设置只影响mysql命令连接服务器时的连接字符集,不会对使用libmysqlclient库的应用程序产生任何作用!
• 对字段进行的SQL函数操作通常都是以内部操作字符集进行的,不受连接字符集设置的影响。
• SQL语句中的裸字符串会受到连接字符集或introducer设置的影响,对于比较之类的操作可能产生完全不同的结果,需要小心!
Mysql字符集设置
标签:
小编还为您整理了以下内容,可能对您也有帮助:
关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)
最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。
首先:
用show variables like “%colla%”;show varables like “%char%”;这两条命令查看数据库与服务端的字符集设置
如果查看出来都是gbk2312,或 gbk,那么就只能支持简体中文,繁体和一些特殊符号是不能插入的,我们只有修改字符集为UTF-8,
修改方法如下:
用记事本或UitraEdit打开mysql数据库安装目录下的my.ini文件打开, 然后Ctrl+F搜索default-character-set,将后面的字符集修改为UTF8,注意要修改两个地方,一个事客户端的,一个是服务端的。
然后保存,重启mysql服务、、进去继续用show variables like “%colla%”;show varables like “%char%”;着两条语句查询一下字符集。 如图:
到此就配置完成了。
注意:
如果以前建有数据库没有删除的 请用 show database 数据库名;和 show create table 表名;查看一下数据库和表的字符集是否为UTF8 , 因为修改my.ini文件,它不能修改原来数据库的的字符集。在命令行下面可以用
alter database 数据库名 character set “字符集”; 命令来修改数据库字符集
还有一点要注意的是,修改为UTF8以后,在命令行下面中文是乱码的,只输出到页面或控制台是正常的,这个问题我也上网查了一下,貌似命令行下面不支持UTF8,我也不太清楚。
当修改以后,在命令行下面如果要插入中文,可以在插入语句之前执行,set names gbk2312;就可以插入中文了,但是不能插入繁体和一些特殊符号。
关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)
最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。
首先:
用show variables like “%colla%”;show varables like “%char%”;这两条命令查看数据库与服务端的字符集设置
如果查看出来都是gbk2312,或 gbk,那么就只能支持简体中文,繁体和一些特殊符号是不能插入的,我们只有修改字符集为UTF-8,
修改方法如下:
用记事本或UitraEdit打开mysql数据库安装目录下的my.ini文件打开, 然后Ctrl+F搜索default-character-set,将后面的字符集修改为UTF8,注意要修改两个地方,一个事客户端的,一个是服务端的。
然后保存,重启mysql服务、、进去继续用show variables like “%colla%”;show varables like “%char%”;着两条语句查询一下字符集。 如图:
到此就配置完成了。
注意:
如果以前建有数据库没有删除的 请用 show database 数据库名;和 show create table 表名;查看一下数据库和表的字符集是否为UTF8 , 因为修改my.ini文件,它不能修改原来数据库的的字符集。在命令行下面可以用
alter database 数据库名 character set “字符集”; 命令来修改数据库字符集
还有一点要注意的是,修改为UTF8以后,在命令行下面中文是乱码的,只输出到页面或控制台是正常的,这个问题我也上网查了一下,貌似命令行下面不支持UTF8,我也不太清楚。
当修改以后,在命令行下面如果要插入中文,可以在插入语句之前执行,set names gbk2312;就可以插入中文了,但是不能插入繁体和一些特殊符号。
mysql列上设置字符集有什么风险
数据存储问题、兼容性问题。
1、数据存储问题。mysql列上设置字符集,会导致数据存储不当或者出现乱码,数据丢失或不可读。
2、兼容性问题。mysql列上设置字符集应用程序在表示数据时出现不一致性,会引起应用程序兼容性问题。
MySQL 的 utf8 字符集的问题
理论上说起来,设置为 utf8也并非一个完全合适、100% 没毛病的值,即便你将 MySQL 的字符集设置为 utf8,也有可能出现乱码!
通过以下命令,你可以查看 MySQL 所支持的所有『字符集』编码:
在显示的 Charset,你会看见熟悉的 utf8。
如果你再仔细看一下这一行,你会发现这一行的 Maxlen列中的值居然是 3!?
这是 MySQL 中的 utf8并非我们现在常说的 『真·UTF8』。它『最多』只用 3 个字节存储一个字符,而有些中日韩生僻字<small>(包括 emoji 表情)</small>的 Unicode 编码是需要 4 个字节宽度才能存储的,这就会导致一些乱码的隐患。
MySQL 解决这个问题的方案是绕过 utf8提出一种新的字符集来实现 『真·UTF8』 功能:utf8mb4。
实际上,为了统一称呼,MySQL 在提出 utf8mb4字符集之后,就将 utf8改为 utf8mb3的别名,因此,你设置字符集为 utf8本质上就是设置成了 utf8mb3。
在更高版本(8.x)的 mysql 中,MySQL 直接将 utf8 改为了 utfmb4 的别名。
MySQL 的 utf8 字符集的问题
理论上说起来,设置为 utf8也并非一个完全合适、100% 没毛病的值,即便你将 MySQL 的字符集设置为 utf8,也有可能出现乱码!
通过以下命令,你可以查看 MySQL 所支持的所有『字符集』编码:
在显示的 Charset,你会看见熟悉的 utf8。
如果你再仔细看一下这一行,你会发现这一行的 Maxlen列中的值居然是 3!?
这是 MySQL 中的 utf8并非我们现在常说的 『真·UTF8』。它『最多』只用 3 个字节存储一个字符,而有些中日韩生僻字<small>(包括 emoji 表情)</small>的 Unicode 编码是需要 4 个字节宽度才能存储的,这就会导致一些乱码的隐患。
MySQL 解决这个问题的方案是绕过 utf8提出一种新的字符集来实现 『真·UTF8』 功能:utf8mb4。
实际上,为了统一称呼,MySQL 在提出 utf8mb4字符集之后,就将 utf8改为 utf8mb3的别名,因此,你设置字符集为 utf8本质上就是设置成了 utf8mb3。
在更高版本(8.x)的 mysql 中,MySQL 直接将 utf8 改为了 utfmb4 的别名。
mysql怎么新建数据库mysql新建数据库字符集怎么选
mysql中怎么新建tid文件?
mysql中新建tid文件方法:
1、点击“开始”进入界面,找到mysql。
2、双击打开mysql软件,输入密码。
3、输入“showdatabases;”即可看到自己创建的数据库。
4、输入“use数据库名”,使用此数据库。
5、输入“sourcesql文件的路径”。
6、输入“showtables”,即可看到导入的表了。
建立数据库xsqk的命令?
我的:mysql中建立数据库xsqk的命令是:
createdatabasexsqk;
创建mysql数据库怎么保存?
概述
存放在C:ProgramDataMysqlMysqlServerx.xdata下(x.x为你安装的版本)解析
安装MySQL的时候有两个路径:1)MySQL的安装文件2)MySQL的数据存放文件。新建的数据库文件则存放在第二个数据库存放文件的路径中
解析
不过大多数人在第一次安装时都会选择默认设置,这种情况下就不清楚存放路径了;1、如果我们也找不到我们当时安装时存放的数据路径,可以在终端呼出mysql然后,输入查询命令showvariableslike'datadir';
2、这时候,会输出一个表格右边的那一列就是数据库存放的路径了:注意programData是隐藏文件夹,需要开启显示,或者直接复制路径过去即可拓展内容
mysqlMySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件。MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。由于其社区版的性能卓越,搭配PHP和Apache可组成良好的开发环境。怎么在mysql中创建表创建数据?
1、使用createtable语句可完成对表的创建,createtable的创建形式:
createtable表名称(列声明);
以创建people表为例,表中将存放学号(id)、姓名(name)、性别(sex)、年龄(age)这些内容:
createtablepeople(
idintunsignednotnullauto_incrementprimarykey,
namechar(8)notnull,sexchar(4)notnull,agetinyintunsignednotnull);
其中,auto_increment就可以使Int类型的id字段每次自增1。
2、向表中插入数据使用insert语句。
insert语句可以用来将一行或多行数据插到数据库表中,使用的一般形式如下:
insert表名values(值1,值2,值3,...);
其中内的内容是可选的,例如,要给上步中创建的people表插入一条记录,执行语句:
insertintopeople(name,sex,age)values("张三","男",21);
3、想要查询是否插入成功,可以通过select查询语句。形式如下:
select*frompeople;
扩展资料:
当mysql大批量插入数据的时候使用insertinto就会变的非常慢,mysql提高insertinto插入速度的方法有三种:
1、第一种插入提速方法:
如果数据库中的数据已经很多(几百万条),那么可以加大mysql配置中的bulk_insert_buffer_size,这个参数默认为8M
举例:bulk_insert_buffer_size=100M;
2、第二种mysql插入提速方法:
改写所有insertinto语句为insertdelayedinto
这个insertdelayed不同之处在于:立即返回结果,后台进行处理插入。
3、第三个方法:一次插入多条数据:
insert中插入多条数据,举例:
insertintotablevalues('11','11'),('22','22'),('33','33')...;
用sqlyog创建数据库的五个步骤?
首先启动xampp的apache和MySQL
然后打开sqlyog
在左侧的页面中右击选择“createdatabase”,输入name,把databasecharset改为utf8
单击Create,就创建了一个database,
这样创建table,view......就比较方便了,
也可以直接在右侧的页面输入语句创建,不过我比较喜欢这种方式,感觉这样方便很多。
mysql中怎么设置字符集
方法1:通过客户端修改表字段的默认字符集
打开SQLyog客户端,连接数据库如下图所示,点击connection 按钮 连接数据库
我的数据库名称为e,然后我随意找到数据库中test2表,右键-----》Alter Table
如果安装数据库的 时候 没有选择字符集设置,那么mysql数据库默认为latin1,在箭头部分选择utf8字符集
方法2:用数据库命令修改字符集
首先查看当前数据库字符集,在命令框中执行如下命令:show variables like 'character_set_%';
查看字符集排序设置,执行命令:show variables like 'collation_%';
修改服务器级别字符集,执行命令:
1,临时修改:SET GLOBAL character_set_server=utf8;
修改表级别,命令如下:ALTER TABLE table_name DEFAULT CHARSET utf8;
修改数据库级别,命令如下:use e(换成你要修改的数据库名,在这里我的数据库为e),,然后执行命令:alter database e character set utf-8;
或者修改mysql的my.ini文件中的字符集键值
[mysql]
[mysqld]
重启mysql