插件创建具有特殊字符集/排序规则考虑因素的表的正确方式是什么?

时间:2014-04-28 作者:Quail

我正在使用WordPress>=3.8。wp config中的默认字符集/排序规则值。php是

define(\'DB_CHARSET\', \'utf8\');
define(\'DB_COLLATE\', \'\'); // Becomes utf8_general_ci
我现在的处境是utf8_general_ci 足够了,但更具体一些(utf8_danish_ci) 将始终能够更好地描述我的数据。同样,从外部源获取的数据总是UTF-8。

我正在开发一个插件来创建一些表

CREATE TABLE plugin_table(
    some_id INT NOT NULL,
    some_data VARCHAR(100) NOT NULL,
    PRIMARY KEY  (some_id)
) ENGINE=InnoDB;
处理字符集和/或排序规则的正确方法是什么?

一种解决方案是使用上面的语句,然后使用全局配置。如前所述,这将在我的情况下起作用,从开发人员的角度来看,我认为要求utf8utf8mb4 已指定。

另一种解决方案是显式设置字符集/排序规则设置:

...) ENGINE=InnoDB [DEFAULT CHARSET=utf8] [COLLATE utf8_danish_ci];
这将允许我以最合适的方式为需要存储的数据配置表,在测试中,我已确认Å, 其处理方式不同utf8_general_ciutf8_danish_ci, 比较正确。这似乎有效,但我不知道这是好的还是坏的做法,特别是,我不知道这是否会在其他地方引起并发症(例如,我应该在查询表格时更改设置吗?)。

这个问题有几个表兄弟,但这似乎不是重复的。The answer that comes closest 还提到了上面的显式方法,并评论说使用默认值可能更合适,“这样用户可以在有充分理由的情况下覆盖它们”。

如果我打算不遗余力地使用核心配置,那么首先指定这些设置似乎很愚蠢。

重要的是要理解,使用非UTF-8永远不会有“好的理由”。关于排序,这个问题不太清楚。

问题可以归结为以下几个方面:考虑到一些非UTF-8核心配置,这将被认为是不受支持的,我应该采取措施使我的插件正常运行吗?

1 个回复
SO网友:Domain

我认为这个问题是由WooCommerce在其插件中处理的。它还创建自己的表,这就是它们处理排序规则部分的方式。(我指的是WooCommerce的class-wc-install.php文件)。他们在create\\u tables函数中编写了以下代码

global $wpdb;

$collate = \'\';

if ( $wpdb->has_cap( \'collation\' ) ) {
    if ( ! empty($wpdb->charset ) ) {
        $collate .= "DEFAULT CHARACTER SET $wpdb->charset";
    }
    if ( ! empty($wpdb->collate ) ) {
        $collate .= " COLLATE $wpdb->collate";
    }
}
然后这个$collate变量被附加在CREATE TABLE 查询

因此,在这种情况下,查询可能如下所示:

CREATE TABLE plugin_table(
    some_id INT NOT NULL,
    some_data VARCHAR(100) NOT NULL,
    PRIMARY KEY  (some_id)
) $collate;
所以他们找到了WordPress的Collate和charset,并附加了它们。

希望有帮助:)

结束

相关推荐

在wp_database中的哪些位置定义了可用角色?

我上榜是为了测试我在多站点网络上使用的插件的私有beta版。插件作者在其中有添加自定义角色的代码。他们有一个bug,它删除了为用户提供除一个自定义角色之外的任何角色的功能。当我访问时../wp-admin/network/site-users.php, “添加用户”角色下拉列表仅显示此插件添加的一个角色。change role下拉菜单显示所有WP默认角色,以及此插件和其他插件添加的一些额外角色。如果我试图将一个用户更改为这些角色之一,我会得到一个“你不能给用户这个角色”错误页面。我一直在与开发人员讨论这个