【问题标题】:Issue when deploying mysql db (utf8mb4_unicode_520_ci -> utf8mb4_unicode_ci)部署 mysql 数据库时的问题 (utf8mb4_unicode_520_ci -> utf8mb4_unicode_ci)
【发布时间】:2017-06-10 14:00:43
【问题描述】:

我开始在我的开发机器上开发一个 wordpress。 mysql 版本是 5.6,worpdress 是 4.7,所以如果检测到可能,它已经在使用 utf8mb4_unicode_520_ci 编码。

我的问题是在我的主机(mysql 5.5)上,utf8mb4_unicode_520_ci 未被识别为有效编码。因此,我试图以 utf8mb4_unicode_ci 编码为目标,因为我的主机知道这一点,如果我理解正确,这将 - 与使用 utf8 相反 - 允许我保留 4 个字节。

我为数据库尝试了几种不同的编码和排序规则组合,但都没有成功(来自这里How to convert an entire MySQL database characterset and collation to UTF-8?)。

我在 wp-config 中尝试了几种编码和排序规则的组合,但没有。

来自数据库的所有内容(如帖子标题和帖子内容为所有 diatrics 显示错误编码的字符,其他任何内容都正确显示)

menu label from the database display incorrectly, where the hardcoded/translated label display correctly

我想我需要转换数据库的实际内容,改变字符集和排序规则似乎不够。

我找到了this,但它并没有直接解决我的问题,或者我错过了它。

任何帮助将不胜感激

—————————————————————————————————

更新

这是我经历的确切过程:

初始情况:

我在本地安装了一个 wordpress (4.6.1)(在我的开发机器上,mysql 5.6.28)。 我在本地开发主题和插件

(此时我在本地有一个utf8_general_ci 的数据库和utf8mb4_unicode_520_ci 的表

问题:

我想在我的主机上部署我的 wordpress(mysql: 5.5 - db collat​​ion 似乎是utf8mb4_unicode_ci)。 我在本地 mysqldump 数据库,然后尝试在我的主机的 phpmyadmin 上导入它。 这给出了错误:

Unknown collation: 'utf8mb4_unicode_520_ci'

解决方案 1 将表格字符集更改为 utf8mb4_unicode_ci:

在我的托管 sql 服务器上,utf8mb4_unicode_520_ci 不可用,我无法获得更新版本的 mysql。

utf8mb4_unicode_ci 似乎是最接近的,并且在我的托管 sql 服务器上可用。

根据各种问题,我调整了一个 bash 脚本来更改我的表格的字符集和排序规则

for tbl in wp_sij2017_commentmeta wp_sij2017_comments wp_sij2017_cwa wp_sij2017_links wp_sij2017_options wp_sij2017_postmeta wp_sij2017_posts wp_sij2017_term_relationships wp_sij2017_term_taxonomy wp_sij2017_termmeta wp_sij2017_terms wp_sij2017_usermeta wp_sij2017_users wp_sij2017_woocommerce_api_keys wp_sij2017_woocommerce_attribute_taxonomies wp_sij2017_woocommerce_downloadable_product_permissions wp_sij2017_woocommerce_order_itemmeta wp_sij2017_woocommerce_order_items wp_sij2017_woocommerce_payment_tokenmeta wp_sij2017_woocommerce_payment_tokens wp_sij2017_woocommerce_sessions wp_sij2017_woocommerce_shipping_zone_locations wp_sij2017_woocommerce_shipping_zone_methods wp_sij2017_woocommerce_shipping_zones wp_sij2017_woocommerce_tax_rate_locations wp_sij2017_woocommerce_tax_rates; do
 mysql --execute="ALTER TABLE wp_sij_2017_original_copy.${tbl} CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
done

我在本地数据库上运行这个脚本 我现在将所有表格都设置为排序规则utf8mb4_unicode_ci

我的数据库排序规则仍然是utf8

我 mysqldump 数据库,然后将其导入我的主机并...

导入成功。

我在数据库中搜索和替换 siteurl。 然后我访问在线网站,我得到了一些呈现“问号字符”的 diatrics

来自数据库的任何文本都存在解码问题在某些时候

source/html 标记也有那些“问号字符”

我不知道该去哪里看或下一步该做什么

【问题讨论】:

  • 您的最后一个链接已损坏。你到底在做什么?从一个系统导出并在另一个系统中导入?如果是这样,您使用什么工具来做到这一点? Wordpress 会自动进行整理/字符集更改/升级。至于您的示例,您是否验证了页面源中的字符类型以及正在使用的编码?
  • 嗨@Seth,我更新了最后一个链接(关于mysql CONVERT/CAST 函数)。我想做的是将我的 wordpress 从本地开发人员带到在线。我是怎么做的:我在本地机器终端中mysqldump数据库,然后通过phpmyadmin导入reuslting文件,然后继续对siteurl值进行searchAndreplace。问题是我的本地机器上的编码如果我的托管 sql 服务器无法识别。
  • @seth 我不确定你所说的the source 是什么意思。从 phpmyadmin 咨询时,数据库中的字符格式正确,无论是在我的本地计算机上还是在托管服务器上。在我的 wp 在我的主机上提供的 html 中,所有的 diatrics 都是问号字符。我的 html 中的字符集元标记是 utf8。
  • 以兼容模式导出(mysqldump选项--compatible=mysql4或phpmyadmin中的下拉值mysql40)不能解决问题(来自这个问题:stackoverflow.com/questions/29916610/…
  • 源代码中的源代码。如果它在源代码中显示正常但在显示器上显示不正常,您可以假设在 HTML 元标记编码和实际文件编码方面发生了一些有趣的事情。特别是如果文本显示在目标系统上的 phpMyAdmin 中,我宁愿假设在从数据库读取并使用 PHP 处理字符串时出现某种错误。

标签: mysql wordpress encoding utf8mb4


【解决方案1】:

澄清:CHARACTER SETsutf8utf8mb4 指定如何将字符编码为字节。 COLLATIONs*_unicode_*等,指定这些字符的比较方式。

utf8mb4_unicode_ciutf8mb4_unicode_520_ci 的编码是相同的,因为它们在字符集utf8mb4编码

“utf8_general_ci 的数据库和 utf8mb4_unicode_520_ci 的表”——这可能意味着该数据库中的 表,除非特别说明,否则将是 CHARACTER SET utf8 COLLATION utf8_general_ci。也就是说,数据库设置只是CREATE TABLE 的默认设置。由于您的表已经是CHARACTER SET utf8mb4 COLLATION utf8mb4_unicode_520_ci,因此数据库默认值与它们无关。

只要CHARACTER SET 保持utf8mb4,任何表情符号、中文等都不会丢失或以其他方式损坏。

不要使用mysql40;它不知道任何 CHARACTER SETs。不要使用CONVERTCAST。等等。

我假设520 来自mysqldump 的输出?你有可以处理这么大文件的编辑器吗?如果是这样,只需编辑它以将utf8mb4_unicode_520_ci 更改为utf8mb4_unicode_ci。然后加载转储。问题解决了吗?

您的解决方法

您在本地计算机上执行了ALTER ... CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci。这可能是一种更好的方法——因为它会使您的开发和生产机器彼此保持一致。那应该行得通。不要担心“数据库”声称的内容。

【讨论】:

  • 嗨@Rick,感谢您对字符集和排序规则的澄清,它最终帮助了:)。我按照你的建议做了(搜索并替换转储中的文本)但这还不够(我已经尝试过了)。但是使它起作用的是将我的 wp-config 中的字符集设置为 utf8 并将排序规则设置为空(所以我猜是“默认” - 我不知道 wp 如何处理它)。 ``` 定义('DB_CHARSET','utf8'); // 定义('DB_COLLATE', 'utf8mb4_unicode_ci'); ```
  • 我只是尝试取消注释定义('DB_COLLATE','utf8mb4_unicode_ci'),它似乎不会引起问题。我仍然很确定我对发生的事情/正在发生的事情有一些了解。但无论如何,这现在正在工作。以为我不确定我是否应该回答我自己的问题,因为我真的不明白为什么今天的解决方案有效......而且@rick 的答案似乎最接近“正确”的答案,但我确定我试过这是昨天的,然后它不起作用,所以也许这里还有其他东西在起作用,我错过了。
【解决方案2】:

我在 .sql 文件中找到“utf8mb4_unicode_520_ci”并替换为“utf8mb4_unicode_ci”。 解决这个问题的原因很简单。

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2017-08-31
    • 2014-05-01
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多