• 特殊汉字“𣸭”引发的对于字符集的思考;mysql字符集;sqlalchemy字符集设置;客户端字符集设置;


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

    在数据的存储上,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=350,max_overflow=50,pool_recycle=300,pool_timeout=60)

    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

  • 相关阅读:
    Distributed System
    APP专项测试之兼容性测试
    面试如何正确谈薪?
    跳槽季,如何做好技术面试准备?
    Appium基础
    设置安装程序位置
    获取文件版本号
    28-PV&PVC
    Docker-文件拷贝
    Kubemark压测常用命令
  • 原文地址:https://www.cnblogs.com/shengulong/p/10222881.html
Copyright © 2020-2023  润新知