mysql列存储表情字符串办法

本文解决了一个MySQL插入Unicode字符时出现的“java.sql.SQLException: Incorrect string value”错误,通过调整字符集设置来支持4字节UTF-8编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://www.cnblogs.com/lowwen/p/5645242.html

问题描述:
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xBB' for column 'nickName' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4226)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4158)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2840)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1302)
at sun.reflect.GeneratedMethodAccessor49.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:55)
at com.sun.proxy.$Proxy58.execute(Unknown Source)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:41)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:66)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:45)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:100)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:75)
解决方法:
1.建表的时候添加如下限制:ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
2.在my.cnf上修改如下:
------------------my.cnf------------------------------------------------------

For advice on how to change settings please see

http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[client]
default-character-set=utf8mb4
[mysql]
default-character-set = utf8mb4

Remove leading # and set to the amount of RAM for the most important data

cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.

innodb_buffer_pool_size = 128M

Remove leading # to turn on a very important data integrity option: logging

changes to the binary log between backups.

log_bin

These are commonly set, remove the # and set as required.

basedir = .....

datadir = .....

port = .....

server_id = .....

socket = .....

Remove leading # to set options mainly useful for reporting servers.

The server defaults are faster for transactions and fast SELECTs.

Adjust sizes as needed, experiment to find the optimal values.

join_buffer_size = 128M

sort_buffer_size = 2M

read_rnd_buffer_size = 2M

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
log-error=/var/log/mysqld.log
long_query_time=3

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

log-slow-queries= /usr/local/mysql/log/slowquery.log


重启mysql服务,service mysql stop; service mysql start;问题解决。
造成这个问题的原因(网上找的):
mysql中规定utf8字符的最大字节数是3,但是某些unicode字符转成utf8编码之后有4个字节,导致出错。



 

### MySQL 错误 1267 的原因分析 在 MySQL 数据库中,错误 `1267` 表示字符集不匹配的问题。具体来说,当尝试将含有特殊字符(如表情符号)的数据插入到字段时,如果该字段的字符集无法支持这些字符,则会触发此错误[^1]。 MySQL 默认使用的字符集是 `latin1` 或者 `utf8`,而这两个字符集并不完全支持 Unicode 中的所有字符,尤其是像表情符号这样的扩展字符。为了正确表情符号,需要使用更广泛的字符集——即 `utf8mb4`,它能够表示多达四个字节长度的字符,从而兼容所有的 Unicode 字符[^1]。 ### 解决方案 #### 修改表结构以支持 utf8mb4 要解决这个问题,可以修改数据库中的相关列或者整个表格来采用 `utf8mb4` 字符集以及对应的排序规则 (collation),比如 `utf8mb4_general_ci` 或 `utf8mb4_unicode_ci`: ```sql ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ``` 这条 SQL 命令将会把指定表内的所有字符串类型的列转换成新的字符集和排序方式。 另外,如果你只想更改特定的一列而不是整张表的话,可以用下面这种方式来进行调整: ```sql ALTER TABLE your_table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ``` 这里假设目标列为可变宽度字符串类型 (`VARCHAR`) 并且最大允许长度为 255;实际应用时应依据实际情况设定合适的参数值。 #### 更新连接配置文件 除了改变数据表本身外,还需要确保客户端与服务器之间的通信也采用了相同的编码标准。这通常涉及到编辑应用程序用来建立数据库链接的相关设置部分。例如,在 PHP 脚本里可以通过如下方法实现这一点: ```php $mysqli->set_charset("utf8mb4"); ``` 对于其他编程环境而言,其操作原理相似,主要是找到负责初始化 DB 连接的地方并加入相应的选项让程序知道应该怎样处理传入传出的信息流。 通过以上措施之后再试运行原先失败的操作命令即可成功保带emoji的内容至相应记录项之中而不遭遇ERROR CODE 1267提示了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值