Swisscom云中mariadb中的默认服务器字符集是什么?如何更改?

Swisscom云中mariadb中的默认服务器字符集是什么?如何更改?,mariadb,swisscomdev,Mariadb,Swisscomdev,这是一份关于SWISCOM Cloud MariaDB服务的澄清请求。这不是关于通用的 我想知道Swisscom云上MariaDB服务的默认定义是什么 假设它实际上是latin1,我想知道是否可以更改此默认值(更改为utf-8,或者更准确地说,更改为utf8mb4) 我提出这个问题的主要原因是,我在创建可以轻松重新导入的备份时遇到了问题,并且在通过mysqldump提取时,我得到的输出大小大不相同-r backup.sql与通过Sequel Pro导出相比我不使用工具Sequel Pro 传统的

这是一份关于SWISCOM Cloud MariaDB服务的澄清请求。这不是关于通用的

  • 我想知道Swisscom云上MariaDB服务的默认定义是什么
  • 假设它实际上是
    latin1
    ,我想知道是否可以更改此默认值(更改为
    utf-8
    ,或者更准确地说,更改为
    utf8mb4

  • 我提出这个问题的主要原因是,我在创建可以轻松重新导入的备份时遇到了问题,并且在通过
    mysqldump提取时,我得到的输出大小大不相同-r backup.sql
    与通过
    Sequel Pro
    导出相比

    我不使用工具
    Sequel Pro

    传统的MariaDB/Galera集群在未设置时使用
    latin1
    作为默认字符集。此默认设置来自上游开发人员。大多数开发人员和DBA不喜欢这个决定

    以下是
    CREATE TABLE
    语法(请参见
    COLLATE
    字符集
    ):

    服务器设置(此语句可由每个客户执行,无需管理员权限):

    如果您仍在使用legacy MariaDB,请尽快使用。旧群集将在一天或两天内成为只读群集

    我们为您准备了全新的MariaDB服务。它来了 经过许多改进(如MariaDB版本10),我们建议 尽快升级

    本分步指南已创建

    新群集使用更好的默认设置:

    MariaDB [(none)]> show global variables like 'character_set%';
    +--------------------------+------------------------------------------------------------------------------------------+
    | 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       | /var/vcap/data/packages/mariadb/95a1896c4bcdccb4e1abd81b7d00eb33aedb0da0/share/charsets/ |
    +--------------------------+------------------------------------------------------------------------------------------+
    8 rows in set (0.01 sec)
    
    如果希望在将数据导入新集群之前更改字符集和排序规则

    ALTER TABLE tbl_name
        [[DEFAULT] CHARACTER SET charset_name]
        [COLLATE collation_name]
    
    我们做了很多次。请记住,您不应该在超过20000条记录的情况下执行此操作

    请也看看我们的

    如有需要,请联系Swisscom应用程序云支持 发布长时间运行的DDL更改(例如
    ALTERTABLE
    (记录汇编)。长时间运行的DDL会导致上的所有客户停机 集群


    这是为了演示两种不同的
    更改
    ;一事无成;一个人做你想做的事:

    --尝试“错误的”更改:

        DROP TABLE IF EXISTS atc;
        CREATE TABLE atc ( c VARCHAR(11))  CHARACTER SET latin1 ;
        INSERT INTO atc (c) VALUES ('ÃÔäô');
        SHOW CREATE TABLE atc\G
        SELECT c, HEX(c) FROM atc;   -- note the latin1 encoding
        ALTER TABLE atc CHARACTER SET utf8;
        SHOW CREATE TABLE atc\G   -- the column stays latin1, overriding the table
        SELECT c, HEX(c) FROM atc;   -- still latin1 encoding
    
    mysql> 
    mysql> -- Try the 'wrong' ALTER:
    mysql> 
    mysql> DROP TABLE IF EXISTS atc;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> CREATE TABLE atc ( c VARCHAR(11))  CHARACTER SET latin1 ;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> INSERT INTO atc (c) VALUES ('ÃÔäô');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SHOW CREATE TABLE atc\G
    *************************** 1. row ***************************
           Table: atc
    Create Table: CREATE TABLE `atc` (
      `c` varchar(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    
    mysql> SELECT c, HEX(c) FROM atc;   -- note the latin1 encoding
    +----------+----------+
    | c        | HEX(c)   |
    +----------+----------+
    | ÃÔäô     | C3D4E4F4 |
    +----------+----------+
    1 row in set (0.00 sec)
    
    mysql> ALTER TABLE atc CHARACTER SET utf8;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> SHOW CREATE TABLE atc\G   -- the column stays latin1, overriding the table
    *************************** 1. row ***************************
           Table: atc
    Create Table: CREATE TABLE `atc` (
      `c` varchar(11) CHARACTER SET latin1 DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    
    mysql> SELECT c, HEX(c) FROM atc;   -- still latin1 encoding
    +----------+----------+
    | c        | HEX(c)   |
    +----------+----------+
    | ÃÔäô     | C3D4E4F4 |
    +----------+----------+
    1 row in set (0.00 sec)
    
    --尝试“正确”的方法:

        DROP TABLE IF EXISTS atc;
        CREATE TABLE atc ( c VARCHAR(11))  CHARACTER SET latin1 ;
        INSERT INTO atc (c) VALUES ('ÃÔäô');
        SHOW CREATE TABLE atc\G
        SELECT c, HEX(c) FROM atc;   -- note the latin1 encoding
        ALTER TABLE atc CONVERT TO CHARACTER SET utf8;
        SHOW CREATE TABLE atc\G   -- column and table are utf8
        SELECT c, HEX(c) FROM atc;   -- now utf8
    
    mysql> 
    mysql> -- Try the 'right' way:
    mysql> 
    mysql> DROP TABLE IF EXISTS atc;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> CREATE TABLE atc ( c VARCHAR(11))  CHARACTER SET latin1 ;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> INSERT INTO atc (c) VALUES ('ÃÔäô');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SHOW CREATE TABLE atc\G
    *************************** 1. row ***************************
           Table: atc
    Create Table: CREATE TABLE `atc` (
      `c` varchar(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    
    mysql> SELECT c, HEX(c) FROM atc;   -- note the latin1 encoding
    +----------+----------+
    | c        | HEX(c)   |
    +----------+----------+
    | ÃÔäô     | C3D4E4F4 |
    +----------+----------+
    1 row in set (0.00 sec)
    
    mysql> ALTER TABLE atc CONVERT TO CHARACTER SET utf8;
    Query OK, 1 row affected (0.03 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    mysql> SHOW CREATE TABLE atc\G   -- column and table are utf8
    *************************** 1. row ***************************
           Table: atc
    Create Table: CREATE TABLE `atc` (
      `c` varchar(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    
    mysql> SELECT c, HEX(c) FROM atc;   -- now utf8
    +----------+------------------+
    | c        | HEX(c)           |
    +----------+------------------+
    | ÃÔäô     | C383C394C3A4C3B4 |
    +----------+------------------+
    1 row in set (0.00 sec)
    
    mysql> 
    

    很高兴看到新的MariaDB默认为UTF-8-我们已经进行了切换,但在恢复备份时出现了问题,这似乎与混合字符集有关。。。MySQL的
    utf8
    UTF-8
    的一个子集。最好一直转到
    utf8mb4
    ALTER
    除了更改新添加列的默认值之外,不做任何其他事情!。请参见
    ALTER。。。改为转换为…
    。是否只更改默认值?或者您也要更改所有的数据编码?
        DROP TABLE IF EXISTS atc;
        CREATE TABLE atc ( c VARCHAR(11))  CHARACTER SET latin1 ;
        INSERT INTO atc (c) VALUES ('ÃÔäô');
        SHOW CREATE TABLE atc\G
        SELECT c, HEX(c) FROM atc;   -- note the latin1 encoding
        ALTER TABLE atc CHARACTER SET utf8;
        SHOW CREATE TABLE atc\G   -- the column stays latin1, overriding the table
        SELECT c, HEX(c) FROM atc;   -- still latin1 encoding
    
    mysql> 
    mysql> -- Try the 'wrong' ALTER:
    mysql> 
    mysql> DROP TABLE IF EXISTS atc;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> CREATE TABLE atc ( c VARCHAR(11))  CHARACTER SET latin1 ;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> INSERT INTO atc (c) VALUES ('ÃÔäô');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SHOW CREATE TABLE atc\G
    *************************** 1. row ***************************
           Table: atc
    Create Table: CREATE TABLE `atc` (
      `c` varchar(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    
    mysql> SELECT c, HEX(c) FROM atc;   -- note the latin1 encoding
    +----------+----------+
    | c        | HEX(c)   |
    +----------+----------+
    | ÃÔäô     | C3D4E4F4 |
    +----------+----------+
    1 row in set (0.00 sec)
    
    mysql> ALTER TABLE atc CHARACTER SET utf8;
    Query OK, 0 rows affected (0.00 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> SHOW CREATE TABLE atc\G   -- the column stays latin1, overriding the table
    *************************** 1. row ***************************
           Table: atc
    Create Table: CREATE TABLE `atc` (
      `c` varchar(11) CHARACTER SET latin1 DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    
    mysql> SELECT c, HEX(c) FROM atc;   -- still latin1 encoding
    +----------+----------+
    | c        | HEX(c)   |
    +----------+----------+
    | ÃÔäô     | C3D4E4F4 |
    +----------+----------+
    1 row in set (0.00 sec)
    
        DROP TABLE IF EXISTS atc;
        CREATE TABLE atc ( c VARCHAR(11))  CHARACTER SET latin1 ;
        INSERT INTO atc (c) VALUES ('ÃÔäô');
        SHOW CREATE TABLE atc\G
        SELECT c, HEX(c) FROM atc;   -- note the latin1 encoding
        ALTER TABLE atc CONVERT TO CHARACTER SET utf8;
        SHOW CREATE TABLE atc\G   -- column and table are utf8
        SELECT c, HEX(c) FROM atc;   -- now utf8
    
    mysql> 
    mysql> -- Try the 'right' way:
    mysql> 
    mysql> DROP TABLE IF EXISTS atc;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> CREATE TABLE atc ( c VARCHAR(11))  CHARACTER SET latin1 ;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> INSERT INTO atc (c) VALUES ('ÃÔäô');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SHOW CREATE TABLE atc\G
    *************************** 1. row ***************************
           Table: atc
    Create Table: CREATE TABLE `atc` (
      `c` varchar(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    
    mysql> SELECT c, HEX(c) FROM atc;   -- note the latin1 encoding
    +----------+----------+
    | c        | HEX(c)   |
    +----------+----------+
    | ÃÔäô     | C3D4E4F4 |
    +----------+----------+
    1 row in set (0.00 sec)
    
    mysql> ALTER TABLE atc CONVERT TO CHARACTER SET utf8;
    Query OK, 1 row affected (0.03 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    mysql> SHOW CREATE TABLE atc\G   -- column and table are utf8
    *************************** 1. row ***************************
           Table: atc
    Create Table: CREATE TABLE `atc` (
      `c` varchar(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    
    mysql> SELECT c, HEX(c) FROM atc;   -- now utf8
    +----------+------------------+
    | c        | HEX(c)           |
    +----------+------------------+
    | ÃÔäô     | C383C394C3A4C3B4 |
    +----------+------------------+
    1 row in set (0.00 sec)
    
    mysql>