我有一个正在进行的项目,我需要从mysql表中获取阿拉伯语文本,并不时插入/更新它们。我在"utf8_general_ci"中有我的数据库排序规则。
起初,我在获取一些阿拉伯语数据时发现问号"???"。然后我执行了"设置字符集 utf8"。该特定问题的问号问题得到了解决,但随后其他阿拉伯语数据开始显示胡言乱语"Ùؤتا"。在项目中,我还需要从包含阿拉伯语文本的csv中获取一些数据。
以下是我在字符集执行之前和之后找到的 json 数据:
[{
"id": 148,
"domain": 0,
"group_name": "ATX ??????????",
"score": 0,
"player_name": "لاعب واحد",
"created_at": "2015-10-26 13:01:23"
},
{
"id": 148,
"domain": 0,
"group_name": "???? ???????",
"score": 1,
"player_name": "اثنين من لاعب",
"created_at": "2015-10-26 12:59:57"
}]
// ---------------------------------------
// After executing "SET CHARACTER SET utf8"
// ---------------------------------------
[{
"id": 148,
"domain": 0,
"group_name": "ATX توكوروزاوا",
"score": 0,
"player_name": "مؤتا",
"created_at": "2015-10-26 13:01:23"
},
{
"user_id": 148,
"domain": 0,
"group_name": "لندن دينيموز",
"score": 1,
"player_name": "كابوا",
"created_at": "2015-10-26 12:59:57"
}]
谁能告诉我这里出了什么问题?我正在尝试解决此问题,但找不到任何解决方案。
مؤتا
是مؤتا
的Mojibake:
- 客户端中的字节以 utf8(良好(正确编码。
- 您可能默认连接了
SET NAMES latin1
(或set_charset('latin1')
或...(。 (应该是utf8
的。 - 表中的列可能
CHARACTER SET utf8
也可能没有,但应该是这样。
لاعب
可能是"双重编码"——避免这条路。
"ATX ??????????"
--
UTF8 需要在大约 4 个地方建立。
- 数据库中的列 -- 使用
SHOW CREATE TABLE
验证它们是显式设置为 utf8 还是表定义中的缺省值。 (仅更改数据库默认值是不够的。 - 客户端和服务器之间的连接。 请参阅
SET NAMES utf8
。 - 您拥有的字节数。 (情况可能就是这样。
- 如果要在网页中显示文本,请检查
<meta>
标记。
另请参阅UTF-8
看起来您的数据库中有 2 种不同字符编码的文本,utf8 和我猜的 latin1。您必须决定绝对使用哪个(我建议使用 utf8(并更新其他编码中的文本以匹配。
尝试这样的事情来测试正确的编码:
SELECT group_name, CONVERT(player_name USING utf8) FROM your_table;
如果输出正确,则可以使用以下方法永久更正数据:
UPDATE your_table SET player_name = CONVERT(player_name USING utf8);
见 https://dev.mysql.com/doc/refman/5.0/en/charset-convert.html