数据库保存奇怪的字符尽管字符集和发送的数据,采用UTF8

时间:2015-06-29 19:10:32

标签: mysql database utf-8 character-encoding mariadb

当我将某些字符保存到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                                                                                |
+--------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+

1 个答案:

答案 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;