PHP 对来自 Aurora MySQL 的 JSON 编码数据失败
PHP fails on JSON encoding data from Aurora MySQL
我最近将应用程序从 MySQL 迁移到了 Amazon Aurora MySQL 服务。我的应用程序从该数据库中获取数据并使用它来搜索 Elasticsearch 索引之一。
PHP Elasticsearch 库的底层 HTTP 客户端在发送到 Elasticsearch 服务器之前将查询数据编码为 JSON。我发现在传递从数据库检索的数据时,有时 json_encode
调用会失败并且 returns 为 false。这是随机发生的,所以我找不到确切的原因。
我的发现如下:
- 从数据库中检索的数据有时包含二进制字符串,并且
json_encode
将此数据传递给它时会失败。
- 我们在数据库级别使用 UTF8 编码,因此这不是问题。
Screenshot of database response
这里有人遇到过与 Aurora 或 MySQL 数据库类似的问题,还是只是 PHP 本身的问题?
在使用 php 和 mysql 时永远不要假设任何事情......8/10 你在想什么不是问题......是问题......
所以,试试这个:
强制编码
function array_utf8_encode($dat){
if (is_string($dat))
return utf8_encode($dat);
if (!is_array($dat))
return $dat;
$ret = array();
foreach ($dat as $i => $d)
$ret[$i] = self::array_utf8_encode($d);
return $ret;
}
$my_db_arr = array_utf8_encode($my_db_arr);
// Now let's encode
$json = json_encode($my_db_arr);
注意 函数 array_utf8_encode 不是我的...但老实说我不记得我在 Whosebug 上找到它的地方...否则我会把link 和相关学分...
有没有错误?
var_dump(json_last_error_msg());
祝你有美好的一天,
安东尼奥
看起来这是 AWS Aurora 本身的问题。另一个人也遇到了类似的问题,AWS 支持团队告诉他现在已经在全球范围内解决了这个问题。
我最近将应用程序从 MySQL 迁移到了 Amazon Aurora MySQL 服务。我的应用程序从该数据库中获取数据并使用它来搜索 Elasticsearch 索引之一。
PHP Elasticsearch 库的底层 HTTP 客户端在发送到 Elasticsearch 服务器之前将查询数据编码为 JSON。我发现在传递从数据库检索的数据时,有时 json_encode
调用会失败并且 returns 为 false。这是随机发生的,所以我找不到确切的原因。
我的发现如下:
- 从数据库中检索的数据有时包含二进制字符串,并且
json_encode
将此数据传递给它时会失败。 - 我们在数据库级别使用 UTF8 编码,因此这不是问题。
Screenshot of database response
这里有人遇到过与 Aurora 或 MySQL 数据库类似的问题,还是只是 PHP 本身的问题?
在使用 php 和 mysql 时永远不要假设任何事情......8/10 你在想什么不是问题......是问题......
所以,试试这个:
强制编码
function array_utf8_encode($dat){
if (is_string($dat))
return utf8_encode($dat);
if (!is_array($dat))
return $dat;
$ret = array();
foreach ($dat as $i => $d)
$ret[$i] = self::array_utf8_encode($d);
return $ret;
}
$my_db_arr = array_utf8_encode($my_db_arr);
// Now let's encode
$json = json_encode($my_db_arr);
注意 函数 array_utf8_encode 不是我的...但老实说我不记得我在 Whosebug 上找到它的地方...否则我会把link 和相关学分...
有没有错误?
var_dump(json_last_error_msg());
祝你有美好的一天,
安东尼奥
看起来这是 AWS Aurora 本身的问题。另一个人也遇到了类似的问题,AWS 支持团队告诉他现在已经在全球范围内解决了这个问题。