php/mysql之间的通信编码错误
Posted
技术标签:
【中文标题】php/mysql之间的通信编码错误【英文标题】:Wrong encoding in communication between php/mysql 【发布时间】:2016-09-23 03:39:47 【问题描述】:您好,我购买了这个使用 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
【问题讨论】:
UTF-8 all the way through的可能重复 放弃mysql_*
API;切换到mysqli_*
或PDO
。
【参考方案1】:
转换成mysqli_*
接口后,使用set_charset('utf8')
函数。
另外,请确保您的列/表声明为 CHARACTER SET utf8
(或 utf8mb4)。请提供SHOW CREATE TABLE
。
我很乐意进一步诊断您的问题,但我需要更多信息。是č
变成?
或Ä
还是被截断或可能是其他东西。我认为它没有办法变成é
,所以我需要更多线索。
【讨论】:
正如我在答案中所写,在我在每个 php 文件中添加这两行代码后,PHP/mysql 通信似乎工作正常。现在问题转移到仍然显示的android应用程序?而不是 č。但是,如果我直接在应用程序的代码中添加 č,它会显示 č,它会显示 ?只有当数据来自mysql数据库时。所以如果我是对的,那么整个问题就是数据库。?
通常来自表定义错误。让我们看看SHOW CREATE TABLE
。
好的,我已经用数据库中最重要的表中的 SHOW CREATE TABLE 结果更新了问题。
Android 使用什么语言(PHP / Java / 等)与数据库通信?
app项目在appcelerator studio(钛工作室),所以是java。问题是我没有构建应用程序,只是买了它,并且有钛合金的东西我不明白,在文档中找不到它如何连接到远程数据库,只找到关于本地 sqlite 数据库的东西,而不是它如何连接到远程sql数据库..【参考方案2】:
感谢 Mees Kluivers,确实有一些信息对我有帮助。我将这两行添加到每个 PHP 文件的开头,现在它在 CMS 和 mysql 数据库中都显示了正确的字符,由于某种原因,android 应用程序仍然显示?而不是 č,但经过一个月的处理,它仍然向前迈出了一大步。
mysql_query("set names 'utf8'");
mysql_query("set charset 'utf8'");
【讨论】:
以上是关于php/mysql之间的通信编码错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 WebSocket 在 UWP Client 和 Java Server 之间进行通信?
数据通信——--传输介质--数据编码--数字调制技术--脉冲编码调制--差错控制
语音通信语音通信系统包括语音硬件采样,抽样量化,PCM编码解码模块,FIR滤波,QPSK调制解调模块,语音增强模块以及语音信号还原