Mysql

utf8_general_ci 的 NodeJS 問題

  • November 1, 2018

我有一個帶有聊天系統的網站。這個聊天系統有一個表’messages’,其中一列是’messagetext’設置為utf8_general_ci(MySQL)。在我的網站中,我使用 php 來查詢數據庫。結果沒問題。

在我的應用程序中,我使用 NodeJS 作為後端,但結果是這樣的:“ ασδασδ ”。此列中儲存有希臘詞。

我試過 iconv-lite、iconv、utf8、decode Json。

我的想法是,在網站上,它從列中獲取值 ‘ασδασΒ 並解碼為 utf8,這樣我才能看到正確的結果。但是在應用程序中這並沒有發生,結果是值而不是實際單詞。

我能做些什麼?

(來自評論)

CREATE TABLE messages (
   id int(11) NOT NULL AUTO_INCREMENT, 
   sender int(11) NOT NULL, 
   reciever int(11) NOT NULL, 
   seen varchar(3) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 'no', 
   datetime datetime NOT NULL, 
   messagetext text NOT NULL, 
   userseen varchar(3) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 'no', 
   PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8

node.js 需要這樣的東西開始:

var connection = mysql.createConnection({ ... , charset : 'utf8'});

是的,ασδασδ在我看來是希臘語。你所擁有的是“Mojibake”。有關導致 Mojibake 的討論,請參閱https://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored 。

不要使用任何形式的編碼/解碼/轉換——它只會使問題更加複雜。如果該連結對您沒有幫助,請提供它要求的額外詳細資訊。

另請參閱https://www.npmjs.com/package/utf8

表格應提及 utf-8:

<form method="post" action="/your/url/" accept-charset="UTF-8">

分析…

‘Κ’(希臘語 Kappa)是 utf8 中的 2 個字節,十六進制 ‘CE9A’。latin1 中的“Κ”是十六進制“CE9A”(2 個字節)“Κ”,如果轉換為 utf8 是十六進制“C38E C5A1”“ÃŽÅ¡”是解釋為 latin1 時的樣子。

注意:最後一個十六進制是您在評論中顯示的內容。

所以,你似乎有“雙重編碼”。

SELECT CONVERT(BINARY(CONVERT(CONVERT(BINARY(CONVERT('ÃŽÅ¡' USING latin1)) USING utf8mb4) USING latin1)) USING utf8mb4);  --> 'Κ'

缺少的是數據流中出現“latin1”的位置。

引用自:https://dba.stackexchange.com/questions/221396