当我将某些字符保存到MariaDB数据库时,它们将被存储为2-4个字符的字符串。
例如,™
作为â„¢
保存在数据库中。
来自包含我的表单的html页面的head
<meta charset="utf-8">
当我检查发送到服务器的标头时,它会显示
Content-Type:text/html; charset=UTF-8
处理表单数据的PHP文件有
$mysqli->set_charset('utf8');
我通过执行以下操作将数据库和表格转换为UTF8:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
检查 information_schema 表中的数据库和表详细信息我可以看到数据库和表字符集为UTF8
,默认排序规则名称为utf8_general_ci
。
但错误编码的字符仍然保存到数据库中。
我正在使用终端查看表格数据,因此观看端的编码应该没有问题。
我还缺少什么?
==编辑==
回应@ rick的评论 -
SHOW CREATE TABLE search_templates;
:
search_templates | CREATE TABLE `search_templates` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`modified` timestamp NULL DEFAULT NULL,
`template` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`space` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`secure` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
和SELECT title, HEX(title) FROM search_templates WHERE id = 25;
:
+-----------------------+--------------------------------------------+
| title | HEX(title) |
+-----------------------+--------------------------------------------+
| Kiddicare abc â„¢ | 4B69646469636172652061626320C3A2E2809EC2A2 |
+-----------------------+--------------------------------------------+
当通过hex-to-text转换器时,它会显示:Kiddicare abc â„¢
。
所以这些字符会像这样保存到DB中,这是否会使问题更清晰?
==编辑==
根据@rick的建议(新增数据,之前的标题栏已被删除):
SELECT title, CONVERT(BINARY(CONVERT( CONVERT(UNHEX(title) USING utf8) USING latin1)) USING utf8) FROM search_templates LIMIT 3;
- &GT;
+--------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| title | CONVERT(BINARY(CONVERT( CONVERT(UNHEX(title) USING utf8) USING latin1)) USING utf8) |
+--------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
| Kids' Games & Toys » Toy Shop » Toys R Us | NULL |
| Kiddicare - Pushchairs | Prams | Car Seats | Baby Equipment | Online Baby Shop | NULL |
| Kiddicare â„¢ | NULL |
+--------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+
答案 0 :(得分:0)
CONVERT(BINARY(CONVERT(
CONVERT(UNHEX('C3A2E2809EC2A2') USING utf8)
USING latin1)) USING utf8) ==> '™'
你有一个&#34;双重编码&#34; TradeMark在该字符串的末尾。
这是
的副本Updating data in MySQL database after inserting in the wrong encoding
修改强>
在上下文中,避免最内层的UNHEX
;做
CONVERT(BINARY(CONVERT(
CONVERT(title USING utf8)
USING latin1)) USING utf8)
实施例
CONVERT(BINARY(CONVERT(
CONVERT('Kiddicare â„¢' USING utf8)
USING latin1)) USING utf8)
--> Kiddicare ™
但是,如果您可以重新加载数据,如果数据是utf8编码的(似乎不是),那么让utf8一直是正确的解决方案&#39; #39;