php / mysql之间的通信编码错误

时间:2016-05-25 13:30:03

标签: php mysql encoding utf-8 collation

你好我买了这个使用sql数据库数据的应用程序代码。英语没有问题,但我需要使用捷克的特殊标志,如č,ř,š,ě,í,é..我可以在CMS中使用这些捷克标志改变数据而没有问题,但在sql数据库中它们是错误的(比如é而不是č),当我改变数据库中的数据时它在CMS中的错误(以不同的方式č是?)而且当然它在Android应用程序中也是错误的,或者因为它不能识别字符集而崩溃。我尝试解决这个问题超过一个月,我已经阅读了这里和谷歌的一切,但仍然不知道问题出在哪里。我甚至手工重建了整个数据库,并为每个表utf8或utf8mb4手动设置。我试图添加到功能

mysql_query("SET NAMES 'utf8mb4'");

mysql_query("SET NAMES 'utf8'");    

但它没有效果,就像我没有做任何事情一样

我当然将所有php文件更改为utf8或utf8mb4,但错误仍然相同。我对数据库做了同样的事情。

如果我跑

SHOW VARIABLES LIKE '%character%'

我得到了这些结果:

character_set_client    utf8mb4
character_set_connection    utf8mb4
character_set_database  utf8
character_set_filesystem    binary
character_set_results   utf8mb4
character_set_server    utf8
character_set_system    utf8
character_sets_dir  /usr/share/percona-server/charsets/

PHP版本5.4.45

感谢您的任何想法或任何帮助。

Update: SHOW CREATE TABLE returned:
    category    CREATE TABLE `category` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `institution_id` int(11) NOT NULL,
 `programme_id` varchar(255) COLLATE utf8_bin NOT NULL,
 `name` varchar(255) COLLATE utf8_bin NOT NULL,
 `description` text COLLATE utf8_bin NOT NULL,
 `question_time` varchar(255) COLLATE utf8_bin NOT NULL,
 `limits` varchar(255) COLLATE utf8_bin NOT NULL,
 `correct_ans_score` int(11) NOT NULL,
 `wrong_ans_score` int(11) NOT NULL,
 `expire_date` varchar(255) COLLATE utf8_bin NOT NULL,
 `no_of_days` varchar(255) COLLATE utf8_bin NOT NULL,
 `status` int(1) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8 COLLATE=utf8_bin


category    CREATE TABLE `category` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `institution_id` int(11) NOT NULL,
 `programme_id` varchar(255) COLLATE utf8_bin NOT NULL,
 `name` varchar(255) COLLATE utf8_bin NOT NULL,
 `description` text COLLATE utf8_bin NOT NULL,
 `question_time` varchar(255) COLLATE utf8_bin NOT NULL,
 `limits` varchar(255) COLLATE utf8_bin NOT NULL,
 `correct_ans_score` int(11) NOT NULL,
 `wrong_ans_score` int(11) NOT NULL,
 `expire_date` varchar(255) COLLATE utf8_bin NOT NULL,
 `no_of_days` varchar(255) COLLATE utf8_bin NOT NULL,
 `status` int(1) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

2 个答案:

答案 0 :(得分:0)

谢谢Mees Kluivers,确实有一些信息帮助了我。我将这两行添加到每个PHP文件的开头,现在它在CMS和mysql数据库中都显示正确的字符,因为某些原因android app仍然显示?而不是č,但它在月经处理后仍然向前迈出了一大步。

mysql_query("set names 'utf8'");
mysql_query("set charset 'utf8'");

答案 1 :(得分:0)

转换为mysqli_*界面后,请使用set_charset('utf8')功能。

另外,请确保您的列/表已声明为CHARACTER SET utf8(或utf8mb4)。请提供SHOW CREATE TABLE

我很乐意进一步诊断您的问题,但我需要更多信息。 č变为?Ä或被截断或可能是其他内容。我认为没有办法变成é,所以我需要更多的线索。