问题描述
所以我的问题是重复的或平凡的,但我确实可以在这里使用一些帮助。我想在3个表格的特定列中存储表情符号和一些特殊字符。我的应用程序是在docker内部运行的工作流引擎Processmaker。此应用程序与作为另一个Docker容器运行的MysqL服务器通信。
要解决此问题,我遵循以下链接,也进行了更改,但都是徒劳的。数据库是动态创建的。
- How to store Emoji Character in MySQL Database
- https://dba.stackexchange.com/questions/153720/mysql-unable-to-store-emoji-in-utf8mb4-collation
如果我错了,请纠正我。 即使我要将表情符号保存到3个表中,我也必须更改:的排序规则和字符集。
- 数据库。
- 我要在其中存储表情符号的关联表。
- 这些表的关联列,其中包含那些表情符号字符。
我通过在创建数据库后运行mySQL查询来实现上述步骤(1-3):
ALTER DATABASE database CHaraCTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_one CONVERT TO CHaraCTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_one CHANGE column_one column_one mediumtext CHaraCTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_two CONVERT TO CHaraCTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_two CHANGE column_two column_two mediumtext CHaraCTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SET NAMES utf8mb4;
为了更改排序规则和字符集,我还尝试了在my.cnf中配置它的方法(以实现步骤1-步骤2):
[MysqLd]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
character-set-client-handshake = FALSE
[MysqL]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
以上所有步骤似乎都不起作用。 MysqL服务器也可以有很多动态创建的数据库。 创建数据库后,我在查询下面运行:
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
我的sql客户端还使用utf8mb4字符集和排序规则作为utf8mb4_unicode_ci。 由于可能有成百上千个数据库,所以我不可能去为每个数据库手动运行这些查询
所以我在想我是否可以在创建数据库后立即运行一些查询,或者有办法吗?
MysqL服务器版本-5.6.48在docker中运行。如果您需要更多信息,请告诉我。
任何帮助将不胜感激。
谢谢。
解决方法
my.cnf
(和其他全局设置)输入 GLOBAL VARIABLES
。
连接到数据库时,默认值来自GLOBAL VARIABLES
。 连接上的任何参数都将覆盖它们。 (示例:大多数编程语言客户端允许您在建立连接时提供CHARACTER SET
和COLLATION
。)
在连接时建立值的另一种方法是在连接后立即运行:
SET NAMES utf8mb4;
SHOW VARIABLES
显示登录时提供的设置以及此后所做的会话更改。
连接时,SET GLOBAL VARIABLES
将更改GLOBALs
,,但不会更改SESSIONs
。
连接时,SET SESSION VARIABLES
会更改SESSION
的值,但在注销时会丢失。
此my.cnf
设置是好是坏;我建议避免:
init_command = SET NAMES utf8mb4
它表示要在任何正在启动的会话中运行SET
。 但是,'root'跳过了这一步!(这可能是为了允许root用户连接而不必修复my.cnf。)
您必须确保客户端使用UTF-8进行编码。细节差异很大。幸运的是,客户正在朝这个方向发展。但是还没有全部。
所以...
计划A
- 使用3个char *值和(可选,一个排序规则)设置my.cnf。
- 不要理会
CREATEs
上的任何内容。 (这样做可能会覆盖my.cnf) - 但是请确保先创建数据库,然后创建表。 (如果系统中已经有一个数据库或表的字符集错误,它将覆盖my.cnf。)
B计划(这有点过分,但很安全。)
- 在连接时始终建立字符集(通过连接参数或
SET NAMES
) - 始终在
CREATE DATABASE
和CREATE TABLE
上明确指定字符集。
杂项
进一步说明:存储例程采用数据库的字符集。
CHARACTER SET
控制编码。这对Emojy至关重要。 utf8mb4
是唯一的解决方案。
COLLATION
处理顺序并确定一个表情符号是否与另一个表情符号“相等”。对于表情符号来说,这很少是一个问题,但是对于文字来说却是很大的问题。对于文本,它控制大小写折叠(为“ A” =“ a”)和重音符号剥离,以及其他问题。
如果使用utf8mb4创建表,则不需要ALTER TABLE
。而且,如果表定义上没有明确的DEFAULT CHARACTER SET
,它将从CREATE DATABASE
等继承。
如果出现问题,Trouble with UTF-8 characters; what I see is not what I stored可以帮助您找出问题出在哪里。
这是一个路线图,需要使用ALTER
来修复表:http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases
utf8mb4_unicode_ci
是一个很旧的排序规则。 utf8mb4_unicode_520_ci
更好。 MySQL 8.0有一个更新的版本。
我的意思是,如果事情被“正确地”初始化,那么您不必做任何ALTERs
。显然,由于在该屏幕快照中显示了“ latin1”,因此没有“正确地”设置内容。
继承层次结构为:
- my.cnf和mysqld参数(设置
GLOBAL VARIABLES
) - connect(将
GLOBAL
复制到SESSION
,然后使用连接参数覆盖) 3。SET NAMES
(覆盖3SESSION VARIABLES
) -
CREATE DATABASE
(为数据库建立可继承的默认值) -
CREATE TABLE
(为表建立可继承的默认值) - 列定义的属性。