将排序规则添加到 utf8mb4 字符集 - MySQL/MariaDB

Adding collation to utf8mb4 charset - MySQL/MariaDB

如果您想在 mysql/mariaDB 中添加自定义排序规则,对于 utf-8 字符集,您可以修改 .../charsets/Index.xml 并使用 LDML-语法:

<charset name="utf8">
  ...
  <collation name="utf8_myown_ci" id="1234">
    <rules>
      <reset>\u0000</reset>
        <i>\u0020</i> <!-- space -->
        ...
    </rules>
  </collation>
  ...
</charset>

但是没有名称为 "utf8mb4" 的字符集标签。所以我创建了一个 name="utf8mb4" 并添加了 collation/rules 标签,在 phpmyadmin 中我可以选择新创建的排序规则。但是我不能插入四个字节的字符;我收到错误

"#1366 - Incorrect string value: '\xF0\x9F\x8D\xB5\xF0\x9F...' for field ..."

(使用内置的 mb4-collat​​ion 我可以做到)。

更准确地说:我有一列 (a) 带有内置排序规则 utf8mb4_general_ci,一列 (b) 带有我自己的排序规则 utf8mb4_myown_ci(在 [=38= 中定义) ]).我在两列中插入相同的数据,在 a 列中没有错误,在 b 列中我将得到如上所述的错误。

我在 Index.xml 中创建了以下条目:

<charset name="utf8mb4">
  <family>Unicode</family>
  <description>UTF-8 MB4 Unicode</description>
  <collation name="utf8mb4_general_ci" id="45">
    <flag>primary</flag>
    <flag>compiled</flag>
  </collation>
  <collation name="utf8mb4_bin"     id="46">
    <flag>binary</flag>
    <flag>compiled</flag>
  </collation>
  <collation name="utf8mb4_myown_ci"  id="213">
  </collation>
</charset>

collat​​ion-tag 为空似乎没有问题,因为我在 charset="utf-8" 中创建了一个空的 utf8_myown_ci 并且这有效。

在utf8mb4_myown_ci的列中我也可以插入3个字节的字符,所以它似乎被解释为一个utf8排序规则。

我尝试了 google 多次,在这里没有找到任何东西,但我找不到任何提示,如何向字符集添加排序规则,这些在 Index.xml 中不存在。

有什么办法吗?感谢您的任何提示!

听起来你没有建立 utf8mb4 连接。

更多疑难解答:

事实证明,我使用了一个占用的排序规则 ID。如果我使用例如501 而不是 213,它有效。