“字符编码地狱”- 端到端配置 mariadb 为 utf8

“字符编码地狱”- 端到端配置 mariadb 为 utf8
Mariadb: "mysql Ver 15.1 Distrib 10.3.8-MariaDB"
OS: Windows 10 64 bit

我一直在努力使用“load data infile”将包含“高 8 位”字符(例如微米字符和长划线)的 csv 数据文件读入 mariadb 中的表中。

数据库、表和列都设置为utf8。

经过多次尝试,我使用外部程序(Notepad++)将 csv 文件从原始 ANSI 代码页 1252(cp1252)编码转换为 utf8,并在 mysql 客户端中手动使用“set names utf8”,以笨拙的方式加载文件。

但是我无法将其设置为程序的默认配置。

通过阅读 Mariadb (Mdb) 文档,我将 my.cnf 设置为-

# Set everything to utf8 (utfmb3 I believe?)
[server]
character_set_server        = utf8
character_set_connection    = utf8
default-collation           = utf8_general_ci
init-connect                = 'SET NAMES utf8'

[client]
character_set_client        = utf8
character_set_connection    = utf8

但 mysql 客户端在两个客户端选项上出现错误-

mysql: unknown variable 'character_set_client=utf8'
mysql: unknown variable 'character_set_connection=utf8'

答案1

我在使用 mariadb 时也遇到了类似的问题。

首先,不应使用默认 my.cnf 中的 character-set-server 和 collat​​ion-server,而必须是 character_set_server 和 collat​​ion_server(仅下划线)。

我的配置如下:

[client]
default-character-set = utf8mb4
[mysqld]
character_set_server   = utf8mb4
collation_server       = utf8mb4_unicode_ci
init-connect = 'SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'

mysql 现在报告以下内容:

mysql -e "show variables where variable_name like '%char%' or variable_name like '%coll%';"

+--------------------------+----------------------------+
| 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/charsets/ |
| collation_connection     | utf8mb4_general_ci         |
| collation_database       | utf8mb4_unicode_ci         |
| collation_server         | utf8mb4_unicode_ci         |
+--------------------------+----------------------------+

在 10.4.7-MariaDB 上测试

答案2

注意:原始编辑已移至答案

我找到了正确的咒语-

[client]
default_character_set=utf8mb4

[mysql]
default_character_set=utf8mb4

[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

这似乎可以完成工作。我仍然不明白为什么看起来像客户端或面向连接的配置变量不被 mysql 客户端接受-

mysql: unknown variable 'character_set_client=utf8'
mysql: unknown variable 'character_set_connection=utf8'

--更新-- 自从将 Mariadb 更新至版本 10.3.12 以来,这个问题似乎又出现了部分中断。

使用与上述相同的配置文件设置,mysql 客户端现在正在报告-

mysql -e "show variables where variable_name like '%char%' or variable_name like '%coll%';"
+--------------------------+-----------------------------------------------+
| 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     | latin1                                        |
| character_set_system     | utf8                                          |
| character_sets_dir       | C:\Program Files\MariaDB 10.3\share\charsets\ |
| collation_connection     | utf8mb4_general_ci                            |
| collation_database       | utf8mb4_general_ci                            |
| collation_server         | latin1_swedish_ci                             |
+--------------------------+-----------------------------------------------+

character_set_server和的设置collation_server已恢复为默认值。我可以通过 mysql 客户端根据每个会话单独更改这些设置,但系统默认值会忽略配置文件中的设置。

除非 v10.3.12 改变了一些关于配置变量的规则,否则这似乎是该版本的一个新问题。

相关内容