字符集、字符序的概念与联系

在数据的存储上,MySQL提供了不同的字符集支持。而在数据的对比操作上,则提供了不同的字符序支持。

MySQL提供了不同级别的设置,包括server级、database级、table级、column级,可以提供非常精准的设置。

什么是字符集、字符序?简单的来说:

  1. 字符集(character set):定义了字符以及字符的编码。
  2. 字符序(collation):定义了字符的比较规则。

举个例子:

有四个字符:A、B、a、b,这四个字符的编码分别是A = 0, B = 1, a = 2, b = 3。这里的字符 + 编码就构成了字符集(character set)。

如果我们想比较两个字符的大小呢?比如A、B,或者a、b,最直观的比较方式是采用它们的编码,比如因为0 < 1,所以 A < B。

另外,对于A、a,虽然它们编码不同,但我们觉得大小写字符应该是相等的,也就是说 A == a。

这上面定义了两条比较规则,这些比较规则的集合就是collation。

  1. 同样是大写字符、小写字符,则比较他们的编码大小;
  2. 如果两个字符为大小写关系,则它们相等。

字符集涉及数据库配置(character_set_database)、数据表配置(默认继承数据库,也可以修改)、列配置(类型为CHAR、VARCHAR、TEXT的列,可以指定字符集/字符序)、server端配置(character_set_server,所有字符最后存储时,使用的编码字符集)、client端配置(character_set_client)、连接端配置(character_set_connection)

  • character_set_client 是指客户端发送过来的语句的编码;
  • character_set_connection 是指mysqld收到客户端的语句后,要转换到的编码;
  • 而 character_set_results 是指server执行语句后,返回给客户端的数据的编码

使用命令查看配置:show variables like 'char%';和 show variables like 'collation_%';

我自己配置的字符集,真是乱极了,所以很容易出现乱码问题

DBA配置的:

使用客户端工具Navicat for MySql连接数据库时指定下面选项后,就可以设置数据表的字符集设置

可以修改数据表的字符集

命令行连接时,设置客户端字符集的方法(使用mysql --help查看更多可用选项):

mysql -h127.0.0.1 -uroot -proot  --default-character-set=utf8mb4

连接后可以看到如下设置情况:

可以在客户端连接里临时修改配置,比如:set @@collation_server=utf8mb4_general_ci;但是这个配置断开后就失效,对其他客户端连接也没有影响。要想全局修改,就得修改配置文件,然后重启mysql。

感受下命令行SET NAMES UTF8;的威力,一次可以设置三个配置。

set names 设置的3个变量就是设置mysqld和客户端通信时,mysqld应该如何解读client发来的字符,以及返回给客户端什么样的编码。

修改配置文件,以mac的xampp配置举例,执行xamppCli进入配置目录,然后修改配置

设置server:

查看结果,数据库也跟着改变,因为数据库的默认字符集继承server:

sqlalchemy做为客户端的字符集设置:

engine = create_engine('mysql+pymysql://user:password@ip:port/db?charset=utf8mb4', echo=False, pool_size=,max_overflow=,pool_recycle=,pool_timeout=)

show create table talbe_name;可以查看table的创建信息

collation_server服务端字符序:

utf8mb4_bin, utf8mb4_general_ci, utf8_bin, utf8_general_ci

ci 代表: casesensitive ignore 排序时不考虑大小写;而 _bin 结尾的排序时考虑大小写。

遗漏问题:

1、不知道navicat for mysql做为客户端连接mysql的时候,如何设置客户端字符集的

总结:

1、server端设置:character_set_server=utf8mb4

2、客户端连接时带上配置:mysql -h127.0.0.1 -uroot -proot  --default-character-set=utf8mb4

参考:

1、http://mysql.taobao.org/monthly/2015/05/07/

2、https://www.cnblogs.com/chyingp/p/mysql-character-set-collation.html

3、https://www.cnblogs.com/digdeep/p/5228199.html

特殊汉字“𣸭”引发的对于字符集的思考;mysql字符集;sqlalchemy字符集设置;客户端字符集设置;的更多相关文章

  1. 如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量

    概述: 本地化是系统或软件运行的语言和文化环境.设置NLS_LANG环境参数是规定Oracle数据库软件本地化行为最简单的方式. NLS_LANG参数不但指定了客户端应用程序和Oracle数据库所使用 ...

  2. [转]sqlldr 导入乱码,Oracle客户端字符集问题

    1,查Oracle数据库创建时候的字符集:oracle服务器端执行 SQL> select name, value$ from sys.props$ where name like 'NLS%' ...

  3. Oracle数据库和客户端字符集

    1.查看数据库字符集信息 SQL> select * from nls_database_parameters;其中,NLS_CHARACTERSET是当前数据库的字符集. 2.客户端字符集 客 ...

  4. MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题 收藏 MySQL中涉及的几个字符集

    MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的.character-set-database:数据 ...

  5. kettle_Spoon 修改共享DB连接带汉字引发的错误

    win10下: kettle_Spoon 修改共享DB连接带汉字引发的错误: Unexpected problem reading shared objects from XML file : nul ...

  6. 由异常:Repeated column in mapping for entity/should be mapped with insert="false" update="false 引发对jpa关联的思考

    由异常:Repeated column in mapping for entity/should be mapped with insert="false" update=&quo ...

  7. ubuntu下设置数据库字符集

    就linux环境下出现的数据库乱码的问题,以ubuntu为例进行的总结 ubuntu环境设置的字符集utf8,windows默认字符集是GBK,Ubuntu的默认字符集为utf-8,这使 得在用tel ...

  8. 为 MySQL 设置默认字符集(UTF-8)避免产生乱码

    环境:Windows 7+Wamp Server+MySQL 5.7.9 查看MySQL默认编码: SHOW VARIABLES LIKE 'character%' character_set_cli ...

  9. 设置mariadb字符集为utf8

    我用的是10.0.25 mariadb,     在centos7系统上,用以下指令设置数据库字符集. [client] default-character-set=utf8 [mysql] defa ...

随机推荐

  1. USACO 6.5 Betsy's Tour (插头dp)

    Betsy's TourDon Piele A square township has been divided up into N2 square plots (1 <= N <= 7) ...

  2. spring调用方法(接口和多个实现类的情况)

    以spring框架注入bean说明接口TestService 有2个实现类 TestServiceImp1 @Service("TestService1") ,TestServic ...

  3. .NET Runtime version 2.0.50727.xxx 执行引擎错误。 (Fatal Execution Engine Error)

    如题问题困扰本人良久. 尝试VS2005.VS2008.VS2010均出现过次问题. 主要现象: 1. Window设计器会崩溃,直接挂掉.(当逐条注释掉一些静态构造函数内的代码是情况好转) 2. 发 ...

  4. CentOS源码安装搭建LNMP全过程(包括nginx,mysql,php,svn)

    服务器环境为:CentOS6.5 64位 目标:搭建LNMP(Linux + Nginx + MySQL + PHP +SVN),其中svn是用来代替ftp,方便开发中调试同步代码 相关目录:所有软件 ...

  5. 远程连接mysql root账号报错:2003-can't connect to MYSQL serve(转)

    远程连接mysql root账号报错:2003-can't connect to MYSQL serve 1.远程连接Linux系统,登录数据库:mysql -uroot -p(密码) 2.修改roo ...

  6. android 视频 2017

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha

  7. JavaSE基础之double数据类型的格式化

    JavaSE基础之double数据类型的格式化 1.double 数据类型的格式化工具类:DoubleFormatUtil.java package cn.com.zfc.util; import j ...

  8. BZOJ 3238 [Ahoi2013]差异(后缀自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3238 [题目大意] 给出一个串,设T[i]表示从第i位开始的后缀, 求sum(len( ...

  9. Loj10167 HDU2089 不要62

    题目描述 杭州人称那些傻乎乎粘嗒嗒的人为 626262(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士 ...

  10. BZOJ 2756: [SCOI2012]奇怪的游戏 网络流/二分

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1594  Solved: 396[Submit][Stat ...