【问题标题】:How to fix hex UTF-8 bytes characters (in an latin1_swedish_ci table)如何修复十六进制 UTF-8 字节字符(在 latin1_swedish_ci 表中)
【发布时间】:2018-01-01 20:06:28
【问题描述】:

我有一个 latin1_swedish_ci 数据库,其中包含 UTF-8 字节字符,显示为 %C5%A1, %C4%8D,...

我已经将数据库和表从 latin1 转换为 utf8,但我仍然需要修复 UTF-8 字节字符。

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

MySQL 默认字符集:

SHOW VARIABLES LIKE  'char%'

character_set_client    utf8mb4 
character_set_connection    utf8mb4 
character_set_database  utf8mb4 
character_set_filesystem    binary  
character_set_results   utf8mb4 
character_set_server    latin1  
character_set_system    utf8    
character_sets_dir  /usr/share/mysql/charsets/  

我尝试了 MySQL 功能但没有成功:

convert(cast(convert(name using  latin1) as binary) using utf8)

我真的需要帮助!谢谢。

【问题讨论】:

  • 它们只是这样显示,还是它们实际上与这些转义序列一起存储(即包含实际的百分号)?
  • 嗨,lenz,它们实际上包含百分比(单词示例:pisarni%C5%A1ka),实际单词应该是 (pisarniska) - 带有 CARON 的拉丁文小写字母 S。
  • 或者pisarniška

标签: mysql encoding utf-8


【解决方案1】:

你在使用 PHP 吗?有电话到urlencode() 吗?不。该函数仅用于构建 url 字符串。

让我们仔细检查一下表格中有什么。做SELECT HEX(...) ... -- pisarniška 应该变成(为清楚起见添加空格):

70697361726E69 C5A1 6B61   if correctly stored as utf8mb4 (or utf8)
70697361726E69 254335 254131 6B61   if urlencoded first

【讨论】:

  • 嗨里克詹姆斯,感谢您的帮助。 SELECT HEX(...) ... -- pisarniška 的输出是 v 254335 254131 6B61
  • 因此,urlencode()(或其他)在插入表格之前被调用。您需要跟踪 MySQL INSERT 之前对文本所做的操作。如果您使用的是 PHP,请使用 grep 查找“urlencode”。如果不是,那么可能是其他一些函数将š 变成了%C5%A1。问题是只有浏览器中的 URL 处理知道如何逆向转换。
猜你喜欢
  • 2014-08-07
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2015-04-28
  • 2020-10-26
  • 1970-01-01
相关资源
最近更新 更多