zoukankan      html  css  js  c++  java
  • Character set 'utf8mb4' is not a compiled character set

        近期在一次MySQL数据迁移的过程中遭遇了字符集的问题,提示为"Character set 'utf8mb4' is not a compiled character set"。即是字符集utf8mb4不是一个编译的字符集以及没有在Index.xml文件中指定。以下是其处理过程及解决的方法。供大家參考。

     

    1、错误提示
    SHELL> mysqlbinlog --database=bs_salary --stop-datetime="2014-12-15 8:24:48" /home/robin/mysql-bin.000399
    > |mysql -uroot -p --force --database=salary_1215
    mysql: Character set 'utf8mb4' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index.xml' file

     

    2、分析与解决
    a、错误分析
    从给出的错误提示来看,说utf8mb4字符集未被编译。而其实这个字符集根本没实用到。


    其次说这个文件中/usr/share/mysql/charsets/Index.xml未指定utf8mb4字符集,须要检查字符集文件夹设置。

    b、字符集检查
    首先检查了新旧环境的字符集设置。两边都为UTF8,例如以下
    mysql> show variables like '%char%';
    +--------------------------+---------------------------------+
    | 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       | /app/soft/mysql/share/charsets/ |
    +--------------------------+---------------------------------+
    # Author : Leshami
    # Blog   :
    http://blog.csdn.net/leshami

    c、服务器字符集路径设置

    对于字符集的路径设置,与错误提示不一致。尝试改动器配置文件
    SHELL> tail -3 /etc/my.cnf
    [client]
    #default-character-set=utf8
    character-sets-dir=/app/soft/mysql/share/charsets/

    改动配置文件后再次碰到错误提演示样例如以下,因此字符集路径不是主要原因
    mysql: Character set 'utf8mb4' is not a compiled character set and is not specified in the '/app/soft/mysql/share/charsets/Index.xml' file
    SHELL> /app/soft/mysql/share/charsets/Index.xml /app/soft/mysql/share/charsets/Index.xml.bk

    d、加入utf8mb4字符集到Index.xml
    直接复制utf8的配置。改为utf8mb4后。加入到/app/soft/mysql/share/charsets/Index.xml故障解决。
    <charset name="utf8mb4">
      <family>Unicode</family>
      <description>UTF-8 Unicode</description>
      <alias>utf-8</alias>
      <collation name="utf8_general_ci"     id="33">
       <flag>primary</flag>
       <flag>compiled</flag>
      </collation>
      <collation name="utf8_bin"            id="83">
        <flag>binary</flag>
        <flag>compiled</flag>
      </collation>
    </charset>

    3、MySQL官方解释

    https://dev.mysql.com/doc/refman/5.5/en/charset-configuration.html

    If you try to use a character set that is not compiled into your binary, you might run into the following problems:

    • Your program uses an incorrect path to determine where the character sets are stored (which is typically the share/mysql/charsets or share/charsets directory under the MySQL installation directory). This can be fixed by using the --character-sets-dir option when you run the program in question. For example, to specify a directory to be used by MySQL client programs, list it in the [client] group of your option file. The examples given here show what the setting might look like for Unix or Windows, respectively:

      [client]
      character-sets-dir=/usr/local/mysql/share/mysql/charsets
      
      [client]
      character-sets-dir="C:/Program Files/MySQL/MySQL Server 5.5/share/charsets"
      
    • The character set is a complex character set that cannot be loaded dynamically. In this case, you must recompile the program with support for the character set.

      For Unicode character sets, you can define collations without recompiling by using LDML notation. See Section 10.4.4, “Adding a UCA Collation to a Unicode Character Set”.

    • The character set is a dynamic character set, but you do not have a configuration file for it. In this case, you should install the configuration file for the character set from a new MySQL distribution.

    • If your character set index file does not contain the name for the character set, your program displays an error message. The file is named Index.xml and the message is:

      Character set 'charset_name' is not a compiled character set and is not
      specified in the '/usr/share/mysql/charsets/Index.xml' file
      

      To solve this problem, you should either get a new index file or manually add the name of any missing character sets to the current file.

    You can force client programs to use specific character set as follows:

    [client]
    default-character-set=charset_name
    

    This is normally unnecessary. However, when character_set_system differs from character_set_server or character_set_client, and you input characters manually (as database object identifiers, column values, or both), these may be displayed incorrectly in output from the client or the output itself may be formatted incorrectly. In such cases, starting the mysql client with --default-character-set=system_character_set—that is, setting the client character set to match the system character set—should fix the problem.

         从上面的描写叙述来看我这个情形。提示的路径与character-sets-dir路劲不一致。通过改动配置文件后,保持了一致。

    找到缺省的Index.xml配置文件是因为多版本号的问题。二是不清楚为什么要加入utf8mb4这个配置到index.xml文件,根本没用到这个字符集。我预计是要所有检測一遍。尽管加入可用了,可是还是感觉不那么可靠。

    鹏城DBA总群

  • 相关阅读:
    github用起来-pycharm中玩好github
    docker使用阿里云镜像报错
    林子大了什么鸟都有
    CentOS7部署docker
    虚拟机无法上网问题
    Centos7安装图形化界面
    分享一款非常棒的数据库文档生成工具,可导出md、excel等格式
    Java常见知识积累
    MySQL必知必会详细总结
    你真的会学习吗?从结构化思维说起
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6822223.html
Copyright © 2011-2022 走看看