创建数据库后立即执行查询

问题描述

所以我的问题是重复的或平凡的,但我确实可以在这里使用一些帮助。我想在3个表格的特定列中存储表情符号和一些特殊字符。我的应用程序是在docker内部运行的工作流引擎Processmaker。此应用程序与作为另一个Docker容器运行的MysqL服务器通信。

解决此问题,我遵循以下链接,也进行了更改,但都是徒劳的。数据库是动态创建的。

  1. How to store Emoji Character in MySQL Database
  2. https://dba.stackexchange.com/questions/153720/mysql-unable-to-store-emoji-in-utf8mb4-collation

如果我错了,请纠正我。 即使我要将表情符号保存到3个表中,我也必须更改:的排序规则和字符集。

  1. 数据库
  2. 我要在其中存储表情符号的关联表。
  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%';

我得到这个结果:

some collation and charset info

我的sql客户端还使用utf8mb4字符集和排序规则作为utf8mb4_unicode_ci。 由于可能有成百上千个数据库,所以我不可能去为每个数据库手动运行这些查询

所以我在想我是否可以在创建数据库后立即运行一些查询,或者有办法吗?

MysqL服务器版本-5.6.48在docker中运行。如果您需要更多信息,请告诉我。

任何帮助将不胜感激。

谢谢。

解决方法

my.cnf(和其他全局设置)输入 GLOBAL VARIABLES

连接到数据库时,默认值来自GLOBAL VARIABLES连接上的任何参数都将覆盖它们。 (示例:大多数编程语言客户端允许您在建立连接时提供CHARACTER SETCOLLATION。)

在连接时建立值的另一种方法是在连接后立即运行:

 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 DATABASECREATE 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”,因此没有“正确地”设置内容。

继承层次结构为:

  1. my.cnf和mysqld参数(设置GLOBAL VARIABLES
  2. connect(将GLOBAL复制到SESSION,然后使用连接参数覆盖) 3。SET NAMES(覆盖3 SESSION VARIABLES
  3. CREATE DATABASE(为数据库建立可继承的默认值)
  4. CREATE TABLE(为表建立可继承的默认值)
  5. 列定义的属性。