从Latin1 Connection存储的UTF8数据,如何检查我的数据是否正常?

时间:2016-07-13 13:34:02

标签: php mysql character-encoding entity-framework-6 utf8mb4

Latin1 Connection,而不是UTF8

我最近收到了使用我网站的人的报告,他们无法用中文或阿拉伯语创建内容。这导致我尝试使用中文字符在我的网站上创建内容,我观察到为这些字符存储的数据是问号?

我从其他问题和文章中意识到我已经读过我可能在'字符集地狱'

似乎我使用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变量。希望能够让您了解之前如何建立连接 以及现在如何建立连接:

之前的连接:

Connection before

更新了连接字符串字符集的连接:

Connection after connection string update

如何确定数据库中的数据是否编码错误,是否将Latin1数据编码为UTF8,以便我可以决定是否可以更改连接字符串以使用UTF8并且一切正常?

更新

我一直在尝试切换Latin1CharSet=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连接进行通信,但我不知道如何确认数据是否正确存储。

3 个答案:

答案 0 :(得分:2)

对于中文,你需要告诉MySQL使用utf8mb4,而不仅仅是utf8。

当您尝试使用utf8 / utf8mb4时,如果您看到问号(常规字号,而非黑色菱形)(?为十六进制3F),

  • 要存储的字节不编码为utf8。解决这个问题。
  • 数据库中的列为CHARACTER SET utf8mb4。解决这个问题。
  • 另外,检查读取时的连接是否为utf8mb4。
{p> 新浪新闻 Mojibake 新浪新闻

尝试使用utf8 / utf8mb4时,如果看到Mojibake,请检查以下内容。 此讨论也适用于双重编码,这不一定是可见的。

  • 要存储的字节需要utf8编码。
  • INSERTingSELECTing文本需要指定utf8mb4时的连接。 (set_charset
  • 需要声明列CHARACTER SET utf8mb4。 (查看SHOW CREATE TABLE。)
  • HTML应以<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功能