如何在MySQL数据库中存储表情符号字符

我有一个MySQL数据库配置默认排序utf8mb4_general_ci。当我尝试使用以下查询在文本中插入包含表情符号字符的行时

insert into tablename
(column1,column2,column3,column4,column5,column6,column7)
values
('273','3','Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌',49,1,'2016-09-13 08:02:29','2016-09-13 08:02:29');

MySQL将引发以下错误

1366错误的字符串值:'\xF0\x9F\x98\x83\xF0\x9F…为列 '注释'在第一行

278053 次浏览

1)数据库:更改数据库默认排序规则为utf8mb4

2)表:更改表排序规则为CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

查询:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3)代码:

INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')

4)在数据库连接中设置utf8mb4:

  $database_connection = new mysqli($server, $user, $password, $database_name);
$database_connection->set_charset('utf8mb4');

如果你正在使用Solr + Mysql + Java,你可以使用:

这可以使用:

  • case1:当您不想更改DB时。
  • 案例2:当你必须从Mysql导入表情到Solr核心。

在上述情况下,这是在您的系统中存储您的表情符号的解决方案之一。

使用步骤:

Library used: import java.net.URLDecoder; 进口java.net.URLEncoder; < / p >

  1. 使用urlEncoder编码你的字符串有表情符号。
  2. 将它存储在DB中而不改变MysqlDB。
  3. 你可以存储在solr核心(解码形式),如果你想要或你可以存储 李编码形式。< / > 当从DB或Solr核心获取这些表情符号时,您现在可以解码它 李使用urlDecoder。< / >

代码示例:

import java.net.URLDecoder;
import java.net.URLEncoder;


public static void main(String[] args) {
//SpringApplication.run(ParticipantApplication.class, args);
System.out.println(encodeStringUrl("🇺🇸🇨🇳🇯🇵🇩🇪🔳🔺🆔🆔🆑3⃣5⃣3⃣‼〽➗➗🎦🔆🎦🔆♋♍♋♍⬅⬆⬅⬅🛂🚹🛂🛄🚳🚬💊🔧💊🗿     "));
System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}


public static String encodeStringUrl(String url) {
String encodedUrl =null;
try {
encodedUrl = URLEncoder.encode(url, "UTF-8");
} catch (UnsupportedEncodingException e) {
return encodedUrl;
}
return encodedUrl;
}


public static String decodeStringUrl(String encodedUrl) {
String decodedUrl =null;
try {
decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
} catch (UnsupportedEncodingException e) {
return decodedUrl;
}
return decodedUrl;
}

我的答案只增加了Selvamani P的答案

你可能还需要用SET NAMES utf8mb4改变任何SET NAMES utf8查询。这招对我很管用。

另外,这是一篇很棒的文章将你的网站从utf8移植到utf8mb4。本文特别指出了两点关于索引和在将表转换为utf8mb4后修复表的问题:

索引

当从utf8转换到utf8mb4时,一个列的最大长度 或者索引键的字节数不变。因此,它更小 就字符而言,因为字符的最大长度是 现在是四个字节,而不是三个。[…InnoDB存储引擎的最大索引长度为767字节,因此对于utf8或utf8mb4列,您可以分别索引最大255或191个字符。如果您当前的utf8列的索引长度超过191个字符,那么在使用utf8mb4时,您将需要索引较少数量的字符

修理表

升级MySQL服务器并进行必要的更改后 如上所述,确保修复和优化所有数据库和 表。我没有在升级后立即这样做(我不认为 是必要的,因为乍一看一切似乎都很好),以及 遇到了一些奇怪的错误,其中UPDATE语句没有任何错误 效果,即使没有抛出错误

阅读本文中关于修复表的查询的更多信息。

第一步,更改数据库的默认字符集:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

如果db还没有创建,请使用正确的编码创建它:

CREATE DATABASE database_name DEFAULT CHARSET = utf8mb4 DEFAULT COLLATE = utf8mb4_unicode_ci;

第二步,创建表时设置字符集:

CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;

或者修改表

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name MODIFY field_name TEXT CHARSET utf8mb4;

我已经更新了我的数据库和表从use utf8升级到utf8mb4。但是什么都不适合我。然后我尝试将列数据类型更新为,幸运的是它为我工作,数据已保存。甚至我的数据库和表都是CHARACTER SET utf8 COLLATE utf8_unicode

修改列的命令如下:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

我们需要使用type = BLOB

修改示例如下:-

ALTER TABLE messages MODIFY content BLOB;

我检查了最新的mySQL和其他数据库不需要''在table_name, column_name等命令中使用。

读取和保存数据: 直接保存聊天内容到列和检索数据,获取数据作为字节数组(byte[])从db列,然后将其转换为string,例如(Java代码)

new String((byte[]) arr)

上面的答案中没有提到的重点是,

我们需要在连接字符串中传递带有选项"useUnicode=yes""characterEncoding=UTF-8"的查询字符串

就像这样

mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8

数据库和表应该有字符集utf8mb4和排序规则utf8mb4_unicode_ci

当创建新的数据库时,你应该使用:

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

如果你有一个现有的数据库并且你想添加支持:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

你还需要为你的表设置正确的字符集和排序规则:

CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;

或者改变它,如果你有现有表和很多数据:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

注意,utf8_general_ci不再是推荐的最佳实践。参见相关的Q &答:

utf8_general_ci和utf8_unicode_ci之间有什么区别在堆栈溢出。

好吧,你不需要改变整个DB字符集。相反,你可以通过将列更改为类型来实现。

修改内容BLOB

表情符号支持的应用程序有技术堆栈- mysql, java, springboot, hibernate

在mysql中应用以下更改以获得unicode支持。

  1. ALTER DATABASE <database-name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  2. ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

数据库连接- jdbc url更改:

jdbc:mysql://localhost:3306/<database-name>?useUnicode=yes&characterEncoding=UTF-8

注意:如果上述步骤不起作用,请将mysql-connector版本更新到8.0.15。(mysql 5.7使用连接器版本8.0.15支持unicode)

对于任何试图在托管MySQL实例上解决这个问题的人(在我的情况下在AWS RDS上),最简单的方法是修改参数组,并将服务器字符集和排序规则分别设置为utf8mb4utf8mb4_bin。重新启动服务器后,快速查询将验证系统数据库和任何新创建的数据库的设置:

SELECT * FROM information_schema.SCHEMATA S;

我有一个很好的解决办法来节省你的时间。我也遇到了同样的问题,但我不能解决这个问题的第一个答案。

您的默认字符是utf-8。但是emoji需要utf8mb4来支持它。 如果您有权限修改mysql的配置文件,您可以执行此步骤

因此,执行以下步骤来升级字符集(从utf-8升级到utf8mb4)。

步骤1。打开mysql的my.cnf,将以下几行添加到my.cnf中。

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'


[mysql]
default-character-set = utf8mb4




[client]
default-character-set = utf8mb4

步骤2。停止mysql服务,然后启动mysql服务

mysql.server stop
mysql.server start
< p >完成! 然后你可以检查你的字符被改变为utf8mb4.

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------------------+
| Variable_name            | Value                                                    |
+--------------------------+----------------------------------------------------------+
| character_set_client     | utf8mb4                                                  |
| character_set_connection | utf8mb4                                                  |
| character_set_database   | utf8mb4                                                  |
| character_set_filesystem | binary                                                   |
| character_set_results    | utf8mb4                                                  |
| character_set_server     | utf8mb4                                                  |
| character_set_system     | utf8                                                     |
| character_sets_dir       | /usr/local/Cellar/mysql@5.7/5.7.29/share/mysql/charsets/ |
+--------------------------+----------------------------------------------------------+
8 rows in set (0.00 sec)

对我来说最简单的解决方案是将数据存储为json_encode

稍后当你检索时,确保你json_decode它。

在这里,您不必更改数据库和表的排序规则或字符集。

嗨,我的朋友们 这就是我解决这个问题的方法,我也很乐意把它教给你们 我在Android应用程序中 我加密了一个包含文本和表情符号的字符串,并将其发送到服务器,并将其保存在mysql表中,从服务器接收到它后,我解密它并在textview中显示它。 在请求之前和响应之后编码和解码我的消息: 我通过这个方法将Android应用程序的消息通过pdo发送到mysql,然后用pdo接收。我没有问题。 我觉得这是个好办法。请像 感谢< / p >


public void main()
{
String message="hi mester ali moradi 🌦️🌦️ how are you ?";
String encoded_message=encodeStringUrl(message);
String decode_message=decodeStringUrl(encoded_message);
}
public static String encodeStringUrl(String message) {
String encodedUrl =null;
try {
encodedUrl = URLEncoder.encode(message, "UTF-8");
} catch (UnsupportedEncodingException e) {
return encodedUrl;
}
return encodedUrl;
}


public static String decodeStringUrl(String message) {
String decodedUrl =null;
try {
decodedUrl = URLDecoder.decode(message, "UTF-8");
} catch (UnsupportedEncodingException e) {
return decodedUrl;
}
return decodedUrl;
}
留言:嗨mester ali moradi🌦️🌦️你好吗? 编码:ghgh%F0%9F%98%AE%F0%9F%A4%90%F0%9F%98%A5 解码:嗨mester ali moradi🌦️🌦️你好吗?

对于Rails,在接受的答案旁边,不要忘记添加:

encoding: utf8mb4
collation: utf8mb4_bin

到你的database.yml

如果使用命令行接口插入sql文件到数据库。

确保你的表字符集utf8mb4和列排序规则utf8mb4_unicode_ciutf8mb4_bin

mysql -u root -p123456 my_database < profiles.sql

错误1366 (HY000)在第1679行:错误的字符串值:'\xF0\x9F\x98\x87\xF0\x9F…第328行“note”列

我们可以用这个参数来解决问题 --default-character-set=name(设置默认字符集)

mysql -u root -p123456 --default-character-set=utf8mb4 my_database < profiles.sql

如果使用PHP进行插入,并且遵循了上面的各种ALTER数据库和ALTER表选项,请确保PHP连接的字符集为utf8mb4。

连接字符串示例:

$this->pdo = new PDO("mysql:host=$ip;port=$port;dbname=$db;charset=utf8mb4", etc etc

注意“charset"是utf8mb4,而不是utf8!

实际上我使用mysql版本8.0.23 我已经创建了数据库和表,没有改变他们:

mysql> CREATE DATABASE tp2;

查询OK,影响1行(0.30秒)

mysql> INSERT INTO tweetsRep(username, content) VALUES ('ibrahim', '🤣 oh my god');

然后选择后,我认为它只是工作正常!

我不知道它是否被要求输入Emoji作为十六进制或其他编码字符串或只是复制它…如果我说错了请指正,谢谢!

有两种方法> #方式一 最简单的步骤如下:

步骤1:

SET NAMES utf8mb4;

步骤2:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

步骤3:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

步骤4:

ALTER TABLE table_name CHANGE column column VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

这就是! !

# 方法二(适用于Python)

这是一个黑客和它的工作就像一个魅力

< p >步骤1: 编码你的字符串并解码成ASCII码,并保存到你的数据库
content = '🥳🥳 Content to be save in 🥳🥳 Database 🥳🥳'
encoded_content = content.encode('unicode-escape').decode('ASCII'))

这只是简单地存储encoded_content字符串在DB中

< p >步骤2: 当获取这个列数据来显示你的用户时,简单地转换它, 这里内容是数据,从数据库中获取
c = bytes(encoded_content, 'utf-8')
original_content = c.decode('unicode-escape')

完成了! !

当我将MySQL 5.0升级到MySQL 8.0 AWS RDS时,我面临着这个问题,尝试了很多东西,最后与你们分享对我有用的东西。

错误:

Warning: PDOStatement::execute(): SQLSTATE[HY000]:一般错误: 3988从排序规则utf8_unicode_ci转换为utf8mb4_general_ci /var/www/html/pdo_con.php第87行

的参数不可能 < p >阵列( [0] =比;HY000 [1] =比;3988 [2] =比;参数不可能从排序utf8_unicode_ci转换为utf8mb4_general_ci) < / p >

后端: PHP5/php7 + PDO正在给麻烦。

解决方案:只需要做两件事

  1. 在pdo连接后的行中添加一个代码

    $conn->exec("set names utf8mb4");
    

    哪里$conn是连接处理程序在PDO

  2. 修改表,设置字符集utf8mb4,并整理utf8mb4_unicode_ci。

    ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    

    该命令将每个列字符集更改为utf8mb4和排序规则。

今天我面临着同样的问题,但其他答案的解决方案对我不起作用。这是我的解决方案。

首先,修改mysql/my.ini、数据库和表中的charset是必要的,如其他答案所述。

其次,如果你在想保存表情符号之前已经创建了你的表,你可以使用

SHOW FULL COLUMNS FROM `yourcolumn`;

使用实例检查要保存的emoji列是否设置为utf8mb4。您可以发现您的大多数列仍然是utf8字符集。

使用

ALTER TABLE `yourtable` CHANGE `yourcolumn` `yourcolumn` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

我尝试了不同的方法和途径,最终找到了一种适合我的方法。

更新查询的SQL语句:

ALTER DATABASE YOUR_DB_NAME_HERE CHARACTER SET = utf8mb4 COLLATE =
utf8mb4_unicode_ci;

你可以在表格中看到,表情符号是存在的

enter image description here

如果你转到这一页:https://www.thecookingcat.com/recipes/thai-green-curry.php#comments

你可以在评论中看到这些表情包。

我在网站上也有RSS提要,表情符号包含在RSS提要XML代码中。

把这个放在数据库调用之前:

    mysqli_set_charset($db, "utf8mb4");

这将允许您直接将表情符号输入到已设置为Collation: utfmb4_bin的数据库表中。确保将您的列也设置为utfmb4。

如果有人在2022年搜索这个,只需遵循这些步骤,不需要在数据库上做任何修改

名称空间

using System.Web;

你的正常文本是这样的:

String encode = "thank you 😊"
encode = HttpUtility.UrlEncode(encode);

它将像这样存储在数据库中:

然后从数据库中获取数据并像这样执行UrlDecode

DataSet ds = "Fetch your Encoded data form your Database";
String decode =  HttpUtility.UrlDecode(ds.Tables[0].Rows[i]["YourColumnName"].ToString().Trim());

你的输出是:-

decode = "thank you 😊".

它对我来说工作得很好,节省了时间。