Вставьте эмодзи, используя. NET C# MySQL - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь вставить эмодзи в мой mysql. но он отображается как ? -> "??".

Это то, что я делал до сих пор.

Моя ASPX-страница

<meta charset="utf-8">

Моя база данных Для таблицы установлено значение:

 utf8mb4_unicode_ci

Для столбца моей базы данных установлено значение:

 utf8mb4_unicode_ci

My MySQL -connectionString:

server=mysql.server.com;uid=testuser;pwd=1234;database=testdb;convert zero datetime=True;charset=utf8mb4;

Однако, если я вставлять эмодзи напрямую с помощью sql -отношения в phpMyAdmin, оно прекрасно работает

INSERT INTO Notification (id, headline, notificationText, sentDate) 
VALUES (null, 'test', '?', NOW())

Но когда я пытаюсь вставить код (. NET C#), оно отображается как "??".

private void EmojiQueryTester()
{
    string strSql = "INSERT INTO Notification (id, headline, notificationText, sentDate) " + 
                     " VALUES (null, 'test', '?', NOW())";
    string strConnectionString = "mysql.server.com;uid=testuser;pwd=1234;database=testdb;" + 
                                 "convert zero datetime=True;charset=utf8mb4";

    using (var mySqlConnection = new MySqlConnection(strConnectionString))
    {
        mySqlConnection.Open();
        var mySqlCommand = new MySqlCommand(strSql, mySqlConnection);
        mySqlCommand.ExecuteNonQuery();
    }
}

enter image description here

id = 27 вставлено моим кодом. NET и id = 28 вставлено phpMyAdmin

Я также пытался вставить другие символы в следующем порядке, но все же не повезло:

U+1F601    |    \xF0\x9F\x98\x81     | 

ПОКАЗАТЬ СОЗДАНИЕ ТАБЛИЦЫ Уведомление

CREATE TABLE `Notification` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `headline` varchar(255) COLLATE utf8mb4_bin NOT NULL,
  `notificationText` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL,
  `sentDate` date NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

enter image description here

SELECT notificationText, HEX(notificationText) FROM Notification

Это запрос моих кодировок

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%' 

enter image description here

Распечатать из HEX-строка

public static string ConvertStringToHex(String input, System.Text.Encoding encoding)
{
    Byte[] stringBytes = encoding.GetBytes(input);
    StringBuilder sbBytes = new StringBuilder(stringBytes.Length * 2);
    foreach (byte b in stringBytes)
    {
        sbBytes.AppendFormat("{0:X2}", b);
    }
    return sbBytes.ToString();
}

protected void Page_Load(object sender, EventArgs e)
{
    string notification = "?";

    DBTool dbT = new DBTool();
    dbT.tester(notification);

    Response.Write(ConvertStringToHex(notification, Encoding.UTF8));
}

выводится в браузере: F09F9880

dbo.HEX (уведомление): 3F3F * 105 9 *

dbo.notification: ??

Таким образом, вывод в браузере, по сути, является заглавным HEX для смайлика, однако в dbo.HEX (уведомлении) он преобразуется в "3F3F". Так что в основном он пишет в ASCII, а не в UTF8, как следует.

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Поместите это в строку подключения:

id=my_user;password=my_password;database=some_db123;charset=utf8mb4;

Console.OutputEncoding = System.Text.Encoding.UTF8;

Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword; CharSet=utf8mb4;

И убедитесь, что столбец в таблице равен CHARACTER SET utf8mb4.

Для дальнейшей отладки:

HEX('?') in utf8mb4 is these 4 bytes: F09F988B
in utf16:  D83DDE0B
0 голосов
/ 17 января 2020

Я предполагаю, что ваше приложение. NET имеет кодировку UTF-16. Два ?? соответствует 2 байтам (16 битам).

Попробуйте кодировать вашу строку в UTF-8:

string sql = "... VALUES (null, 'test', '?', NOW())";
byte [] bytes = Encoding.Default.GetBytes(sql);
string encoded = Encoding.UTF8.GetString(bytes);
// ...
var mySqlCommand = new MySqlCommand(encoded, mySqlConnection);

Я не уверен на 100%, но все остальное, что вы нам показали кажется последовательным.

...