问答中心分类: MYSQL如何在 MySQL 数据库中存储表情符号字符
0
匿名用户 提问 1月 前

我有一个使用默认排序规则配置的 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…’ 用于第 1 行的列 ‘comment’

Tomas Buteler 回复 1月 前

您如何保存数据?你能告诉我们那个代码吗?

Tomas Buteler 回复 1月 前

谢谢你的评论。我已经找到将此更改数据库默认集合的解决方案设置为 **utf8mb4 ** 并将更改表集合设置为 ** CHARACTER SET utf8mb4 COLLATE utf8mb4_bin **。ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

Tomas Buteler 回复 1月 前

代码 :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'在数据库连接中设置 utf8mb4 :$database_connection = new mysqli($server, $user,$password,$database_name); $database_connection->set_charset("utf8mb4");

Tomas Buteler 回复 1月 前

你用的是什么客户端?您还可以指定utf8mb4连接时。

23 Answers
0
Selvamani P 回答 1月 前

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');
AliN11 回复 1月 前

是否可以不更改数据库默认集合?

Selvamani P 回复 1月 前

必须在使用表情符号字符之前对其进行更改。

Curious Developer 回复 1月 前

这对我不起作用。我正进入(状态 ”???”而不是表情符号。只有“☺”这个笑脸安全地进入了数据库。

Selvamani P 回复 1月 前

您是否将数据库默认集合更改为 **utf8mb4 ** ?

Ael 回复 1月 前

可能不仅需要将表更新为 utf8mb4,还需要将列本身更新,否则它们仍然可以显示为 ??而不是💙。

3Nex 回复 1月 前

这行得通。从这里开始,如果我想通过 MySQL 配置进行此操作,而不是调用 PHPset_charset(),我需要在哪里进行更改?我试过似乎所有的组合,但都不起作用。这是我当前的配置:` [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] collat​​ion-server = utf8_unicode_ci init-connect=’SET NAMES utf8′ character-set-server = utf8`

Ravi Misra 回复 1月 前

为我工作,但不要忘记重新启动 MySQL。

Rick James 回复 1月 前

@AliN11 – 数据库CHARACTER SETCOLLATION只是默认值对于新创建的表。也没有改变的紧迫性。相反,养成在每个CREATE TABLE.

cubbuk 回复 1月 前

我需要跑步SET NAMES utf8mb4;开始保存表情符号;在该命令之前,它将它们保存为??

Jeff Tian 回复 1月 前

经过ALTER TABLE xxx CONVERT TO CHARACTE SET utf8mb4它声称Specified key was too long; max key length is 767 bytes

Renish Patel 回复 1月 前

CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 为我工作

Ben Carp 回复 1月 前

关于为什么失败的一些解释可能会有所帮助。

Kip 回复 1月 前

如果你使用COLLATE utf8mb4_bin,然后文本字段上的 ORDER BY 变为区分大小写(即“XYZ”出现在“abc”之前)。您可能想使用COLLATE utf8mb4_general_ci.

Moaiz 回复 1月 前

我将默认排序规则更改为 utf8,因为默认排序规则会在数据库中产生一些错误。所以我想添加表情符号但添加????在列中。我能做些什么 ?

Moaiz 回复 1月 前

当我运行迁移命令时,该错误将出现在迁移中,而不是此错误显示Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

Shreyan Mehta 回复 1月 前

很短,只需要第 2 步

Nandostyle 回复 1月 前

它对我有用。但是,我首先尝试使用 Mysql Workbench GUI 来更改联盟,但这并没有帮助。直接执行 SQL 查询就可以了。

Muhammad Omer Aslam 回复 1月 前

使用时的任何差异utf8mb4_bin对比utf8mb4_unicode_ci对于列?

Ali 回复 1月 前

如果您正在使用Symfony项目,机会来自上述4步解决方案,您只需要解决最后一步,连接调整。只需转到您的.env在您的开发机器或相应的 prod env 文件上并更改DATABASE_URL使用utf8mb4代替utf8.

0
Harpreet 回答 1月 前

修改列的命令是:

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)
davidkonrad 回复 1月 前

是的。如果您只需要在某个字段中存储像表情符号这样的 unicode,那么接受的答案太侵入性了,只需更改text/varchar字段blob你就完成了。疯狂地为此在整个数据库上转换字符集和排序规则:)

m9m9m 回复 1月 前

我尝试更改排序规则,但只有 blob 类型解决了我的问题(PHP)。

rinogo 回复 1月 前

可能值得指出的是,“正确”的方法是将我们的数据库迁移到utf8mb4.但是对于一个或两个领域的快速破解,这是最好的方法。

0
samawaat 回答 1月 前

数据库和表应该有字符集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不再推荐最佳实践。见相关问答:
utf8_general_ci 和 utf8_unicode_ci 有什么区别关于堆栈溢出。

Seyyed Mahdiyar Zerehpoush 回复 1月 前

我有一个包含数据的数据库和表。在执行第二个 alter 语句时,说:错误 1833(HY000):无法更改列“id”:用于表“lizbazi.post”的外键约束“FK12njtf8e0jmyb45lqfpt6ad89”

theartofrain 回复 1月 前

@SeyyedMahdiyarZerehpoush – 您也许可以将更新限制在需要它的特定列,如下所述:stackoverflow.com/a/15781925/1247581例如ALTER TABLE mytable MODIFY my_emoji_friendly_text_column VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Muhammad Omer Aslam 回复 1月 前

使用时的任何差异utf8mb4_bin对比utf8mb4_unicode_ci对于列?

lombardo 回复 1月 前

谢谢@SeyyedMahdiyarZerehpoush,我只是在需要表情符号时更改列表,仅此而已。无需在数据库或表级别更改排序规则和字符集

0
Sunil Gupta 回答 1月 前

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

  • case1:当您不想更改数据库时。
  • case2:当你必须将表情从你的 Mysql 导入到 Solr 核心时。

在上述情况下,这是将表情符号存储在系统中的解决方案之一。
使用步骤:
使用的库:import java.net.URLDecoder;导入 java.net.URLEncoder;

  1. 使用 urlEncoder 对具有表情符号的字符串进行编码。
  2. 将其存储在 DB 中而不更改 MysqlDB。
  3. 如果需要,您可以将其存储在 solr core(解码形式)中,也可以存储编码形式。
  4. 从 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;
}
Toby Speight 回复 1月 前

感谢您提供此代码片段,它可能会提供一些有限的即时帮助。恰当的解释会大大提高通过展示其长期价值为什么这是一个很好的解决问题的方法,并且对于未来有其他类似问题的读者来说会更有用。请编辑您的回答添加了一些解释,包括您所做的假设。

Rick James 回复 1月 前

编码/解码函数调用往往会造成麻烦。而是在各个地方修复字符集设置。

Jonathan Laliberte 回复 1月 前

这不是解决问题,而是绕过它。而且你会遇到很多使用这种方法的问题,例如你会减慢你的应用程序,因为你必须对所有内容进行解码和编码。另外,如果您输入字符%,您的解码将中断。

0
Deepak Arora 回答 1月 前

我已将数据库和表更新为从utf8utf8mb4.但没有什么对我有用。然后我尝试将列数据类型更新为斑点,幸运的是它对我有用,并且数据已保存。甚至我的数据库和表都是字符集 utf8 整理 utf8_unicode