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之间的通信编码错误的主要内容,如果未能解决你的问题,请参考以下文章

Java UDP通信小程序到UDP服务器

如何使用 WebSocket 在 UWP Client 和 Java Server 之间进行通信?

node.js 和 PHP 之间如何通信?

数据通信——--传输介质--数据编码--数字调制技术--脉冲编码调制--差错控制

语音通信语音通信系统包括语音硬件采样,抽样量化,PCM编码解码模块,FIR滤波,QPSK调制解调模块,语音增强模块以及语音信号还原

在内核模式和用户模式之间使用ioctl通信