Sql 角色不在曲目UTF8中

Sql 角色不在曲目UTF8中,sql,postgresql,encoding,utf-8,character,Sql,Postgresql,Encoding,Utf 8,Character,我正在使用UTF8中的一些日语文本,除了一个非常罕见的情况外,它工作得非常好。我想在PostgreSQL数据库中插入UTF8文本(在MySQL上也尝试过),但出现以下错误: SQLSTATE[22021]: Character not in repertoire: 7 ERREUR: invalid byte sequence for encoding "UTF8": 0xe3 0x2e 0x2e 我通过多种方式检查了文本,它似乎是正确的UTF8(使用mb_check_编码PHP函数和自制的C

我正在使用UTF8中的一些日语文本,除了一个非常罕见的情况外,它工作得非常好。我想在PostgreSQL数据库中插入UTF8文本(在MySQL上也尝试过),但出现以下错误:

SQLSTATE[22021]: Character not in repertoire: 7 ERREUR: invalid byte sequence for encoding "UTF8": 0xe3 0x2e 0x2e
我通过多种方式检查了文本,它似乎是正确的UTF8(使用mb_check_编码PHP函数和自制的C进行了尝试)。我还尝试了许多在线转换器,比如:

无论如何,我无法检测到哪个字符对应于0xe3 0x2e 0x2e

以下是日文文本(由Facebook Graph API在UTF8中给出):

我已经发现了3个不同的文本(上千个)在试图插入SQL时给出了这个错误。每次出现问题的字符都是相同的:0xe3 0x2e 0x2e

几个小时后,我现在请求您的帮助…

根据规则,3个字节的有效序列必须如下所示:

1110xxxx 10xxxxxx 10xxxxxx

其中,
1
0
是固定位,
x
表示值可能为
1
0
的位

您的序列
0xe3 0x2e 0x2e
是二进制的:

111000110010111000101110

根据上面的模式,我用黑体字写的第一个
0
应该是
1
,序列才有效。粗体的第二个
0
也是UTF-8中的另一个错误数字

所以它是无效的

此外,php的
mb\u check\u encoding()
也会将其报告为无效,因此您的php检查可能是错误的。试试这个:

<?php
$bytes = pack("H*", "E32E2E");
$res = mb_check_encoding($bytes, "UTF-8");
if ($res)
  echo "Valid";
else
  echo "Invalid";
?>


E3 2E不是有效的UTF-8字节序列。延续字节应在80-BF范围内;2E是ASCII的
。感谢您的回答。我试过你的代码,但我也试过用上面我粘贴的UTF8文本。它显示为有效。在SQL中插入文本时,无效的0xe3 0x2e 0x2e从何而来?@AlessandroGiuliani:您的pastebin是有效的,因为它从不包含无效序列。不清楚它与您的问题有何关系。my pastebin包含引发我在尝试插入它时描述的SQL错误的字符串。SQL告诉有效字符串包含无效序列。@AlessandroGiuliani:然后是该过程将这些内容转换并注入到有缺陷的SQL查询或SQL参数中。所有这些pastebin都不应该产生
0xe3 0x2e 0x2e
序列。我发现了问题,我的truncate函数将utf8字符分开,从而破坏了它。我用这个修正了它: