我在项目中使用表情符号字符。该字符被保存(??)到mysql数据库中。我在utf8mb4_general_ci
中使用了数据库默认排序规则。
它显示
1366字符串值不正确:'\ xF0 \ x9F \ x98 \ x83 \ xF0 \ x9F ...'列 第1行的“评论”
答案 0 :(得分:174)
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', 'Hdhdhdhhzhzhzzhjzj 我爱你 ❌', 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');
答案 1 :(得分:13)
步骤1,更改数据库的默认字符集:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
步骤2,在创建表时设置charset:
CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;
或更改表格
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name modify name text charset utf8mb4;
答案 2 :(得分:12)
如果您使用的是Solr + Mysql + Java,则可以使用:
可以使用:
在上述情况下,这是将表情符号存储在系统中的解决方案之一。
使用它的步骤:
使用的库:import java.net.URLDecoder; import java.net.URLEncoder;
代码示例:
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;
}
答案 3 :(得分:7)
我的回答只是增加了Selvamani P的答案。
您可能还需要使用SET NAMES utf8
更改任何SET NAMES utf8mb4
个查询。这对我有用。
此外,this is a great article将您的网站从utf8移植到utf8mb4。特别是本文在将索引转换为utf8mb4之后对索引和修复表提出了2个好点:
<强>指标强>
从utf8转换为utf8mb4时,列的最大长度 或索引键在字节方面不变。因此,它更小 就角色而言,因为角色的最大长度是 现在是四个字节而不是三个。 [...] InnoDB存储引擎的最大索引长度为767字节,因此对于utf8或utf8mb4列,最多可以索引255或191个字符。如果您当前的索引长度超过191个字符的utf8列,则在使用utf8mb4时需要索引较少数量的字符。
修复表格
升级MySQL服务器并进行必要的更改后 如上所述,确保修复和优化所有数据库和 表。升级后我没有立即这样做(我没想到 因为乍一看似乎一切正常,所以是必要的,并且 碰到了一些奇怪的错误,其中UPDATE语句没有任何错误 效果,即使没有抛出任何错误。
阅读有关修复文章表格的查询的更多信息。
答案 4 :(得分:6)
我已将数据库和表从 utf8 升级到 utf8mb4 。但是对我来说没有任何用。然后,我尝试将列数据类型更新为 blob ,幸运的是它对我有用,并且数据已保存。甚至我的数据库和表都是 CHARACTER SET utf8 COLLATE utf8_unicode
答案 5 :(得分:5)
修改列的命令是:
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;
我们需要使用type = BLOB
要修改的示例如下:-
ALTER TABLE messages MODIFY content BLOB;
我检查了最新的mySQL和其他数据库是否不需要''
才能在table_name,column_name等上的命令中使用。
获取并保存数据:
将聊天内容直接保存到列中并检索数据,然后从db列中以字节数组(byte[])
的形式获取数据,然后将其转换为string
,例如(Java代码)
new String((byte[]) arr)
答案 6 :(得分:5)
上面的答案中没有提到要点,
我们需要在连接字符串中传递带有选项 "useUnicode=yes"
和 "characterEncoding=UTF-8"
的查询字符串
类似这样的东西
mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8
答案 7 :(得分:4)
我有一个很好的解决方案,可以节省您的时间。我也遇到同样的问题,但是我无法通过第一个答案解决这个问题。
您的默认字符为utf-8。但是表情符号需要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
完成! 然后,您可以检查您的角色是否已更改为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)
答案 8 :(得分:3)
数据库和表都应具有字符集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
最佳实践。请参阅相关的问答:
What's the difference between utf8_general_ci and utf8_unicode_ci关于堆栈溢出。
答案 9 :(得分:2)
最适合我的解决方案是将数据存储为 json_encode 。
稍后在检索时,只需确保对其进行 json_decode 。
在这里,您不必更改数据库和表的排序规则或字符集。
答案 10 :(得分:1)
对于试图在托管MySQL实例(在我的情况下为AWS RDS)上解决此问题的任何人,最简单的方法是modify the parameter group并将server character set and collation设置为utf8mb4
和{ {1}}。重新引导服务器后,快速查询将验证系统数据库和任何新创建的数据库的设置:
utf8mb4_bin
答案 11 :(得分:1)
对于Rails,不要忘记添加以下内容:
encoding: utf8mb4
collation: utf8mb4_bin
到您的数据库。yml
答案 12 :(得分:0)
有两种方式--> # 方法一 最简单的方法是按照以下步骤操作:
第 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)
这是一个黑客,它的工作就像一个魅力
第 1 步: 对您的字符串进行编码并以 ASCII 进行解码,然后将其保存到您的数据库中。
content = '?? Content to be save in ?? Database ??'
encoded_content = content.encode('unicode-escape').decode('ASCII'))
这只是将编码内容字符串存储在数据库中
第 2 步: 在获取此列数据以显示您的用户时,只需将其转换, 这里content是从数据库中获取的数据。
c = bytes(encoded_content, 'utf-8')
original_content = c.decode('unicode-escape')
完成!!
答案 13 :(得分:0)
实际上我使用的是 mysql Ver 8.0.23 我已经创建了数据库和表,没有改变它们:
mysql> CREATE DATABASE tp2;
查询成功,1 行受影响(0.30 秒)
mysql> INSERT INTO tweetsRep(username, content) VALUES ('ibrahim', '? oh my god');
然后选择后,我觉得它运行良好!
我不知道是否要求将表情符号输入为十六进制或其他编码字符串,或者只是照原样复制...如果我错了,请纠正我,谢谢!
答案 14 :(得分:0)
如果您使用PHP进行插入,并且已遵循上述各种ALTER数据库和ALTER表选项,请确保您的php连接的字符集为utf8mb4。
连接字符串示例:
$this->pdo = new PDO("mysql:host=$ip;port=$port;dbname=$db;charset=utf8mb4", etc etc
请注意,“字符集”是utf8mb4,而不仅仅是utf8!
答案 15 :(得分:0)
如果使用命令行界面将sql文件插入数据库。
确保您的表字符集utf8mb4
和列排序规则utf8mb4_unicode_ci
或utf8mb4_bin
mysql -u root -p123456 my_database < profiles.sql
第1679行的错误1366(HY000):不正确的字符串值:第328行的'note'列的'\ xF0 \ x9F \ x98 \ x87 \ xF0 \ x9F ...' >
我们可以用这个参数解决问题
--default-character-set=name
(设置默认字符集)
mysql -u root -p123456 --default-character-set=utf8mb4 my_database < profiles.sql
答案 16 :(得分:0)
嗨,我的朋友们 这就是我解决这个问题的方式,也很高兴也教您 我在Android应用程序中 我对包含文本和emoj的字符串进行加密,然后将其发送到服务器,并将其保存在mysql表中,从服务器接收到它之后,我将其解密并在textview中显示。 在请求之前和响应之后对我的消息进行编码和解码: 我通过这种方法通过pdo将Android应用消息发送到mysql,并通过pdo接收它们。而且我没有问题。 我认为这是个好方法。请喜欢 感激
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;
}
答案 17 :(得分:0)
表情符号支持具有技术堆栈的应用程序-mysql,java,springboot,休眠
在下面的mysql更改中应用以支持unicode。
ALTER DATABASE <database-name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
数据库连接-jdbc网址更改:
jdbc:mysql://localhost:3306/<database-name>?useUnicode=yes&characterEncoding=UTF-8
注意-如果上述步骤不起作用,请将mysql-connector版本更新为8.0.15。 (mysql 5.7与连接器版本8.0.15一起使用,以支持unicode)
答案 18 :(得分:0)
那么,您无需更改整个数据库字符集。相反,您可以通过将列更改为 blob 类型来实现。
ALTER TABLE消息修改内容BLOB;