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

What is the default server characterset in mariadb inside the Swisscom Cloud and how can it be changed?

这是关于 Swisscom Cloud MariaDB 服务的澄清请求。这与通用 MariaDB default charactersets 无关。

  1. 我想知道 Swisscom Cloud 上 MariaDB 服务的默认 character_set_server 定义是什么。
  2. 假设它实际上是 latin1,我想知道是否可以更改此默认值(更改为 utf-8 或更准确地说 utf8mb4,因为它是 debian mariadb package).

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

导出

我不使用工具 Sequel Pro

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

这是 CREATE TABLE 语法(参见 COLLATECHARACTER SET):

CREATE TABLE tbl_name (column_list)
    [[DEFAULT] CHARACTER SET charset_name]
    [COLLATE collation_name]]

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

MariaDB [(none)]> show global variables like 'character_set%';
+--------------------------+-------------------------------------+
| Variable_name            | Value                               |
+--------------------------+-------------------------------------+
| character_set_client     | latin1                              |
| character_set_connection | latin1                              |
| character_set_database   | latin1                              |
| character_set_filesystem | binary                              |
| character_set_results    | latin1                              |
| character_set_server     | latin1                              |
| character_set_system     | utf8                                |
| character_sets_dir       | /usr/share/mariadb-galera/charsets/ |
+--------------------------+-------------------------------------+
8 rows in set (0.00 sec)

如果您还在使用遗留的 MariaDB,请快点 migrate your service instance。遗留集群将在一两天内处于只读状态。

We have a completely new MariaDB service in store for you. It comes with many improvements (e.g. MariaDB version 10) and we recommend to upgrade as soon as possible.

本分步指南创建于 Aug 16, 2017

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

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 条记录执行此操作。

也请看看我们的documentation for MariaDB

Please contact Swisscom Application Cloud support when you need to issue long running DDL changes (for example ALTER TABLE with thousends of records). Long running DDL causes an outage for all customers on the cluster.

这是为了演示两种不同ALTERs;一个无所作为;一个做你想做的事:

-- 试试 'wrong' 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)

-- 尝试 'right' 方式:

    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>