我最近收到了使用我网站的人的报告,他们无法用中文或阿拉伯语创建内容。这导致我尝试使用中文字符在我的网站上创建内容,我观察到为这些字符存储的数据是问号?
。
我从其他问题和文章中意识到我已经读过我可能在'字符集地狱'。
似乎我使用Latin1
连接使用Entity Framework连接到数据库,因为这是MySQL的默认设置,但我数据库中的列是UTF8
。
根据我对该过程的了解,我认为我的数据库中的数据是来自浏览器的UTF8
数据,在传输到数据库期间编码为Latin1
,然后再次编码为{ {1}}就在它存储在数据库之前。
当我将连接设置为使用UTF8
时,我一直在使用PHP脚本来确定数据是否正确 - 当我从数据库中选择数据时,看起来没有任何区别
UTF8
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<?php
//
// Make the connection to the database
//
$link = mysqli_connect('localhost','root', '', 'mydatabase');
if (!$link) {
die('Could not connect to MySQL: ' . mysql_error());
}
// Set connection character set to UTF8
$link->set_charset('utf8');
echo '<p>Connection OK</p>';
//
// Request the string from the database
//
$result = $link->query("SELECT questiontext FROM question WHERE id = 101");
$row = $result->fetch_assoc();
// Display the data
echo "Result: " . $row['questiontext'] . '<br/>';
mysqli_close($link);
?>
</body>
</html>
连接请求一个类似于[AZ 0-9]字符的字符串,则使用此PHP脚本,它会在屏幕上显示,就像在{{1使用Entity Framework时的连接,我无法区分。没有出现是数据的任何问题。UTF8
连接检索时会显示为问号。我预计当我使用Latin1
连接连接到数据库时,数据将显示为垃圾,就像我以前使用UTF8
连接一样 - 但它不是。< / p>
我使用Entity Framework来查询在我的连接字符串中添加UTF8
之前和之后用于连接的MySql变量。希望能够让您了解之前如何建立连接 以及现在如何建立连接:
之前的连接:
更新了连接字符串字符集的连接:
如何确定数据库中的数据是否编码错误,是否将Latin1数据编码为UTF8,以便我可以决定是否可以更改连接字符串以使用UTF8并且一切正常?
我一直在尝试切换Latin1
和CharSet=utf8;
之间的连接类型,这些是我的发现......
如果我将连接类型设置为UTF8
并输出字符,我最终会得到类似的内容:
Tu es dansune led serte
HEX(bin2hex):54752065732064616e7320756e6520 ee 6c652064 e9 7365727465203a
如果我将我的连接设置为Latin1
:
Tu es dansuneîledéserte
HEX(bin2hex):54752065732064616e7320756e6520 c3ae 6c652064 c3a9 7365727465203a
(Rick James添加的粗体和间距)
使用UTF8连接时,根本没有任何狡猾的字符 - 只有当我将连接类型设置为latin1
时。这让我相信我的数据编码没问题,大概只是直接的UTF8。
我只能从中解读,实体框架一直在通过UTF8连接进行通信,但我不知道如何确认数据是否正确存储。
答案 0 :(得分:2)
对于中文,你需要告诉MySQL使用utf8mb4,而不仅仅是utf8。
当您尝试使用utf8 / utf8mb4时,如果您看到问号(常规字号,而非黑色菱形)(?
为十六进制3F
),
CHARACTER SET utf8mb4
。解决这个问题。新浪新闻
Mojibake 新浪新闻
尝试使用utf8 / utf8mb4时,如果看到Mojibake,请检查以下内容。 此讨论也适用于双重编码,这不一定是可见的。
INSERTing
和SELECTing
文本需要指定utf8mb4时的连接。 (set_charset
)CHARACTER SET utf8mb4
。 (查看SHOW CREATE TABLE
。)<meta charset=UTF-8>
开头。 (你这样做了。)要验证,请执行SELECT col, HEX(col) FROM ...
。如果新
的十六进制输出为E696B0
,则使用utf8 / utf8mb4正确编码。如果你得到C3A6E28093C2B0
,那就是&#34;双重编码&#34;。 通常如果十六进制以E或F开头,则可能是正确编码的。此外,单个汉字的十六进制在所有情况下都是6或8长。 Reference
答案 1 :(得分:0)
尝试使用它:
//显示数据
回声“结果:”。 utf8_encode($ row ['questiontext'])。 '
';
)
答案 2 :(得分:0)
application-&gt; mysql:select HEX('中国')
mysql-&gt;应用程序:select UNHEX('E4B8ADE59BBD')
你可以使用MySQL功能