zoukankan      html  css  js  c++  java
  • mysql字符集查看、修改utf8mb4

    https://www.cnblogs.com/yangmingxianshen/p/7999428.html

    https://blog.csdn.net/kikajack/article/details/84668924

    https://www.cnblogs.com/amyzhu/p/9595665.html

    一、查看字符集

    1.查看MYSQL数据库服务器和数据库字符集

    方法一:show variables like '%character%';
    方法二:show variables like 'collation%';


    mysql> show variables like '%character%';
    +--------------------------+--------------------------------------+
    | Variable_name            | Value                                |
    +--------------------------+--------------------------------------+
    | character_set_client     | utf8                                 |
    | character_set_connection | utf8                                 |
    | character_set_database   | utf8                                 |
    | character_set_filesystem | binary                               |
    | character_set_results    | utf8                                 |
    | character_set_server     | utf8                                 |
    | character_set_system     | utf8                                 |
    | character_sets_dir       | /usr/local/mysql5535/share/charsets/ |
    +--------------------------+--------------------------------------+
    8 rows in set (0.00 sec)

    utf8mb4 已成为 MySQL 8.0 的默认字符集,在MySQL 8.0.1及更高版本中将 utf8mb4_0900_ai_ci 作为默认排序规则。
    新项目只考虑 utf8mb4

    UTF-8 编码是一种变长的编码机制,可以用1~4个字节存储字符。

    因为历史遗留问题,MySQL 中的 utf8 编码并不是真正的 UTF-8,而是阉割版的,最长只有3个字节。当遇到占4个字节的 UTF-8 编码,例如 emoji 字符或者复杂的汉字,会导致存储异常。

    从 5.5.3 开始,MySQL 开始用 utf8mb4 编码来实现完整的 UTF-8,其中 mb4 表示 most bytes 4,最多占用4个字节。从 8.0 之后,将会在某个版本开始用 utf8mb4 作为默认字符编码。
    设置服务器默认字符集为 utf8mb4

    创建数据库时,如果没有指定字符集,会采用服务器的默认字符集。设置服务器默认字符集为 utf8mb4 可以提高便利性。
    编辑 MySQL 的配置文件

    只需要关心5个系统变量,这5个都改为 utf8mb4 则修改成功:
    character_set_client
    character_set_connection
    character_set_results
    character_set_server
    character_set_database

    my.cnf 是MySQL 的配置文件,修改之前记得先备份:
    在[mysqld]下面加上default-character-set=utf8后服务器启动不了,莫名其妙。后来这么改就好了(MySQL5.7):

    [mysqld]
    init_connect='SET collation_connection = utf8mb4_unicode_ci'
    init_connect='SET NAMES utf8mb4'
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    skip-character-set-client-handshake
    ...
    [client]
    default-character-set=utf8mb4

    重启并确认

    可以看到,系统编码、连接编码、服务器和客户端编码都设置为 UTF-8了:

    mysql> show variables like "%char%";
    +--------------------------------------+--------------------------------+
    | Variable_name                        | Value                          |
    +--------------------------------------+--------------------------------+
    | character_set_client                 | utf8mb4                        |
    | character_set_connection             | utf8mb4                        |
    | character_set_database               | utf8mb4                        |
    | character_set_filesystem             | binary                         |
    | character_set_results                | utf8mb4                        |
    | character_set_server                 | utf8mb4                        |
    | character_set_system                 | utf8                           |
    | character_sets_dir                   | /usr/share/mysql-8.0/charsets/ |
    | validate_password.special_char_count | 1                              |
    +--------------------------------------+--------------------------------+
    9 rows in set (0.00 sec)

    MySQL 中字符集相关变量

    character_set_client:客户端请求数据的字符集
    character_set_connection:从客户端接收到数据,然后传输的字符集
    character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。
    character_set_filesystem:把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的
    character_set_results:结果集的字符集
    character_set_server:数据库服务器的默认字符集
    character_set_system:存储系统元数据的字符集,总是 utf8,不需要设置
    创建数据库时指定字符集为 utf8mb4

    如果数据库默认字符集不是 utf8mb4,那么可以在创建数据库时指定字符集:

    CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    

    排序字符集 collation

    字符除了需要存储,还需要排序或比较大小。推荐用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也没啥问题。

    MySQL 8.0 默认的是 utf8mb4_0900_ai_ci,属于 utf8mb4_unicode_ci 中的一种,具体含义如下:

        uft8mb4 表示用 UTF-8 编码方案,每个字符最多占4个字节。
        0900 指的是 Unicode 校对算法版本。(Unicode归类算法是用于比较符合Unicode标准要求的两个Unicode字符串的方法)。
        ai指的是口音不敏感。也就是说,排序时e,è,é,ê和ë之间没有区别。
        ci表示不区分大小写。也就是说,排序时p和P之间没有区别。

    utf8mb4 已成为默认字符集,在MySQL 8.0.1及更高版本中将utf8mb4_0900_ai_ci作为默认排序规则。以前,utf8mb4_general_ci是默认排序规则。由于utf8mb4_0900_ai_ci排序规则现在是默认排序规则,因此默认情况下新表格可以存储基本多语言平面之外的字符。现在可以默认存储表情符号。如果需要重音灵敏度和区分大小写,则可以使用utf8mb4_0900_as_cs代替。

    1.utf8与utf8mb4(utf8 most bytes 4)

    • MySQL 5.5.3之后增加了utfmb4字符编码
    • 支持BMP(Basic Multilingual Plane,基本多文种平面)和补充字符
    • 最多使用四个字节存储字符

    utf8mb4是utf8的超集并完全兼容utf8,能够用四个字节存储更多的字符。

    标准的UTF-8字符集编码是可以使用1-4个字节去编码21位字符,这几乎包含了世界上所有能看见的语言。
    MySQL里面实现的utf8最长使用3个字符,包含了大多数字符但并不是所有。例如emoji和一些不常用的汉字,如“墅”,这些需要四个字节才能编码的就不支持。

    2.字符集、连接字符集、排序字符集

    utf8mb4对应的排序字符集有utf8mb4_unicode_ci、utf8mb4_general_ci.

    utf8mb4_unicode_ci和utf8mb4_general_ci的对比:

    • 准确性:
      • utf8mb4_unicode_ci是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序
      • utf8mb4_general_ci没有实现Unicode排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。
      • 但是,在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。
    • 性能
      • utf8mb4_general_ci在比较和排序的时候更快
      • utf8mb4_unicode_ci在特殊情况下,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。
      • 但是在绝大多数情况下发,不会发生此类复杂比较。相比选择哪一种collation,使用者更应该关心字符集与排序规则在db里需要统一。
     
     
  • 相关阅读:
    ruby 二进制转十进制 Integer("0b101") = 5
    开始菜单和我的文档的我的图片及我的音乐变成 my pictrues 正常图标了
    ruby watir 莫名其妙的错误
    Excel SaveAS是去掉提示框
    apache && jboss安装
    ruby require include的区别
    ruby控制鼠标
    This error is raised because the column 'type' is reserved for storing the class in case of inheritance
    用正则表达式限制文本框只能输入数字,小数点,英文字母,汉字等各类代码
    ASP.NET 如何动态修改 Header 属性如添加 Meta 标签 keywords description!
  • 原文地址:https://www.cnblogs.com/zhao1949/p/14713704.html
Copyright © 2011-2022 走看看