【问题标题】:Setting UTF-8 in MariaDB server ignores character_set_system在 MariaDB 服务器中设置 UTF-8 会忽略 character_set_system
【发布时间】:2021-05-25 23:02:31
【问题描述】:

我有以下 Dockerfile MariaDB 服务器的定义文件:

version: "3.8"

...

services:
  database:
    command: ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
    container_name: mariadb
    environment:
      MARIADB_DATABASE: sample_database
      MARIADB_INITDB_SKIP_TZINFO: "true"
      MARIADB_PASSWORD_FILE: /run/secrets/mariadb_user_password
      MARIADB_ROOT_PASSWORD_FILE: /run/secrets/root_user_password
      MARIADB_USER: mariadb
      TZ: "Etc/UTC" # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
    image: docker.io/library/mariadb:10.6-focal # https://hub.docker.com/_/mariadb/
    networks:
      - global-network
    ports:
      - "3306:3306"
    restart: on-failure
    secrets:
      - mariadb_user_password
      - root_user_password
    stdin_open: true
    tty: true
    volumes:
      - "database-volume:/var/lib/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    |utf8mb3                   |
|character_sets_dir      |/usr/share/mysql/charsets/|
+------------------------+--------------------------+


> show variables like 'collation%';
+--------------------+------------------+
|Variable_name       |Value             |
+--------------------+------------------+
|collation_connection|utf8mb4_unicode_ci|
|collation_database  |utf8mb4_unicode_ci|
|collation_server    |utf8mb4_unicode_ci|
+--------------------+------------------+

我的理解是我拥有的设置:--character-set-server=utf8mb4 和 --collation-server=utf8mb4_unicode_ci 是正确的设置,字符集和排序规则都设置为UTF-8。

现在我的问题是:如何摆脱 utf8mb3 的 character_set_system 值?它应该与其他值一起设置为utf8mb4——或者这就是我的想法;)

任何线索如何正确设置?

我想避免使用任何配置文件(如my.cnf),因为我使用的是未进行任何修改的库存 Docker 映像。

【问题讨论】:

  • 您通常可以卷挂载 cnf 文件,但请注意我应该更正的 this issue。来自文档character_set_system 是一个固定值,但这个固定值可能在the recent server changes 中发生了变化。
  • 我认为这就是原因(最后一个链接):utf8 字符集(和相关排序规则)现在默认是 utf8mb3 的别名,而不是相反我>。因为character_set_system 的值是固定的,并且始终是utf8,所以现在它显示为utf8mb3。如果您想这样写您的评论,我会接受您的回答。

标签: database unicode character-encoding mariadb


【解决方案1】:

character_set_system 指定将用于存储标识符和其他内部信息的字符集。

它是 3byte utf8,除非更改源并重新编译 MariaDB,否则无法更改。

从 10.6 开始,utf8 被映射到 utf8mb3(在以后的版本中将被映射到 utf8mb4)。见MDEV-8334

【讨论】:

    【解决方案2】:

    我在 MariaDB 10.6.5 中遇到了类似的问题,我试图从 AWS 加载转储并出现以下错误:

    ERROR 1253 (42000) at line 26: COLLATION 'utf8mb3_general_ci' is not valid for CHARACTER SET 'utf8mb4'
    

    我的配置如下所示:

    MariaDB [(none)]> 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     | utf8mb3                    |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    

    根据此页面https://mariadb.com/kb/en/old-mode/ 我必须在/etc/mysql/mariadb.conf.d/50-server.cnf 中将old-mode 设置为空

    旧模式=

    因此它改变了

    MariaDB [(none)]> SHOW VARIABLES LIKE '%old%';
    +------------------------------------------+-----------------+
    | Variable_name                            | Value           |
    +------------------------------------------+-----------------+
    | old_mode                                 | UTF8_IS_UTF8MB3 |
    +--------------------------+---------------------------------+
    

    到

    MariaDB [(none)]> SHOW VARIABLES LIKE '%old%';
    +------------------------------------------+-----------------+
    | Variable_name                            | Value           |
    +------------------------------------------+-----------------+
    | old_mode                                 |                 |
    +--------------------------+---------------------------------+
    

    所以即使character_set_system 仍然显示utf8mb3,我也设法加载了SQL 转储。

    某人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多