我需要在 RTE 中以及稍后在前端显示一些数学/希腊符号。通过复制/粘贴或“插入字符”选项插入它们效果很好,但是一旦我保存文本,插入的符号就会被问号替换,并且 T3 会引发以下错误:
1:表“tt_content”中记录56的这些字段没有正确保存:bodytext!由于数据库的类型转换,这些值可能已更改。
我认为 T3 或我的 DB 的字符集存在问题,但我不知道从哪里开始寻找。
我需要在 RTE 中以及稍后在前端显示一些数学/希腊符号。通过复制/粘贴或“插入字符”选项插入它们效果很好,但是一旦我保存文本,插入的符号就会被问号替换,并且 T3 会引发以下错误:
1:表“tt_content”中记录56的这些字段没有正确保存:bodytext!由于数据库的类型转换,这些值可能已更改。
我认为 T3 或我的 DB 的字符集存在问题,但我不知道从哪里开始寻找。
在我的 7.6.8 上测试过,它似乎工作正常。当我登录到我的 mysql 并运行此查询时:
SELECT default_character_set_name FROM information_schema.SCHEMATA
WHERE schema_name = "7_6_local_typo3_org";
(7_6_local_typo3_org 是数据库名称)它返回:
+----------------------------+
| default_character_set_name |
+----------------------------+
| utf8 |
+----------------------------+
1 row in set (0.00 sec)
还有整理:
SELECT default_collation_name FROM information_schema.SCHEMATA
WHERE schema_name = "7_6_local_typo3_org";
+------------------------+
| default_collation_name |
+------------------------+
| utf8_general_ci |
+------------------------+
1 row in set (0.00 sec)
然后我的 my.cnf (mysql 配置文件)中也有:
character-set-server = utf8
collation-server = utf8_general_ci
将带有 UTF-Icons 的 HTML 粘贴到 TYPO3-8.7.x 中的 Raw-HTML 内容元素中时出现类似问题,但是当我对符号进行编码时它可以工作,例如:
<span class="menuicon">⌚</span>
错误信息的可能原因
1:表“tt_content”中记录X的这些字段没有正确保存:bodytext!由于数据库的类型转换,这些值可能已更改。
在 TYPO3 安装中(示例安装版本:)10.4.20
可以是
TYPO3至少从 9.5 版开始支持utf8mb4。随之而来的是适当的 Unicode 支持,包括 CKEditor 中的表情符号、数学符号和希腊字母(例如⌚∰β)bodytext
。
我通过以下方式将我的 TYPO3 安装的数据库和配置迁移到utf8mb4,摆脱了上述错误消息并正确保存和显示 Unicode 多字节字符。
确保首先在测试环境中应用这些迁移,然后在生产系统上应用这些迁移之前检查现有内容并测试通常的内容编辑场景,以确保 MySQL/MariaDB 在字符集之间正确转换并且没有数据丢失(截断)。
更新 TYPO3 数据库表以utf8mb4
用作字符集和utf8mb4_unicode_ci
排序规则。
以下bash单行循环遍历数据库中的所有表typo3
并应用这些更新。它假定 MySQL/MariaDB root 权限、无密码套接字连接和名为typo3
. 相应地适应。测试成功
for tbl in $(mysql --disable-column-names --batch -e 'select distinct TABLE_NAME from information_schema.tables where table_schema="typo3" and table_type="BASE TABLE";'); do echo "updating table $tbl" && mysql -e "ALTER TABLE typo3.${tbl} CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"; done
为了确保在此转换过程中(从“较小”编码到每个字符最多四个字节的 utf8mb4 编码)没有(字符串)数据丢失/截断,MySQL/MariaDB 自动调整文本/字符串列的数据类型到更大的文本/字符串数据类型,例如 from TEXT
toMEDIUMTEXT
。
要将某些 TYPO3(扩展)表的列恢复为其指定的数据类型,请访问TYPO3 后端 -> 维护 -> 分析数据库结构。此工具将允许恢复这些列的原始(较小)数据类型。这可能会导致数据截断。我不确定 TYPO3 是否会在实际发生截断时发出警告,但假设 TYPO3(扩展)开发人员在指定/设计列的数据类型时考虑了utf8mb4并且特定数据库单元格的用户提供的内容不是太大,截断不应该发生(文本/字符串数据类型大小概述)。
将 TYPO3 配置为使用utf8mb4。例如,在利用 时typo3conf/AdditionalConfiguration.php
,在 中具有以下配置AdditionalConfiguration.php
:
// ...
$GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['charset'] = 'utf8mb4';
$GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['tableoptions']['charset'] = 'utf8mb4';
$GLOBALS['TYPO3_CONF_VARS']['DB']['Connections']['Default']['tableoptions']['collate'] = 'utf8mb4_unicode_ci';
// ...