gorm记一次“mysql写入 Error 1366 (HY000): Incorrect string value”错误

2023-11-05

记一次“mysql写入 Error 1366 (HY000): Incorrect string value”错误

环境go+gorm+docker+mysql

写入数据库的内容为中文时提示Error 1366 (HY000): Incorrect string value: '\xE6\x9D\x8E\xE7\x99\xBD' for column 'nickName' at row 1,原因是创建表时没有指定字符集为utf8
解决方案: 创建数据库表时指定表为utf8,gorm的设置是在AutoMigrate函数调用前指定表的字符集:

db.Set("gorm:table_options", "CHARSET=utf8").AutoMigrate(&entity.UserInfo{})
db.Create(&record)

检查是否生效,进入docker中mysql Terminal,输入show create table TbUserInfo;查看建表语句,如下:

mysql> show create table TbUserInfo;
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                                                                                                                                                                                                                                                                                                                              |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TbUserInfo | CREATE TABLE `TbUserInfo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `accountName` varchar(191) DEFAULT NULL,
  `nickName` varchar(191) DEFAULT NULL,
  `portraitURL` longtext,
  `birthday` longtext,
  `phone` longtext,
  `gender` longtext,
  PRIMARY KEY (`id`),
  UNIQUE KEY `accountName` (`accountName`),
  UNIQUE KEY `nickName` (`nickName`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

说明go代码指定建表的字符为utf8确实生效了。如果建表时没有指定utf8,建表信息就是如下所示:

```log
mysql> show create table TbUserInfo;
+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                                                                                                                                                                                                                                                                                                               |
+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TbUserInfo | CREATE TABLE `TbUserInfo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `accountName` varchar(191) DEFAULT NULL,
  `nickName` varchar(191) DEFAULT NULL,
  `portraitURL` longtext,
  `birthday` longtext,
  `phone` longtext,
  `gender` longtext,
  PRIMARY KEY (`id`),
  UNIQUE KEY `accountName` (`accountName`),
  UNIQUE KEY `nickName` (`nickName`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.02 sec)

经过上述go代码修改,写入数据库成功,通过我的查询代码,查出来我的插入数据为

{
    "code": 2013,
    "info": "{\"ID\":1,\"AccountName\":\"leebai\",\"NickName\":\"李白\",\"PortraitURL\":\"localhost:8080/path\",\"Birthday\":\"1990-01-01\",\"Phone\":\"13688449696\",\"Gender\":\"male\"}"
}

说明确实成功了。

对于业务流程来说确实已经解决了,没有问题了,此时我想要到我的dockermysql容器中去看看我的插入数据是什么样的,查询结果如下:

sh-4.2# mysql -u root -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.41 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use mall;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------+
| Tables_in_mall |
+----------------+
| TbUserInfo     |
+----------------+
1 row in set (0.00 sec)

mysql> select * from TbUserInfo;
+----+-------------+----------+---------------------+------------+-------------+--------+
| id | accountName | nickName | portraitURL         | birthday   | phone       | gender |
+----+-------------+----------+---------------------+------------+-------------+--------+
|  1 | leebai      | ??       | localhost:8080/path | 1990-01-01 | 13688449696 | male   |
+----+-------------+----------+---------------------+------------+-------------+--------+
1 row in set (0.00 sec)

可以看到nickName所在列的中文变成了??,但是我们的go程序是可以返回正常的中文李白的,所以怀疑是mysql容器中的客户端连接工具的字符集有问题,
输入如下命令,查询客户端的字符集是latin1,该字符集无法显示中文字符。

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> show variables like 'collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | latin1_swedish_ci  |
| collation_database   | latin1_swedish_ci  |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

经过一番面向Google查询,只需要修改mysql容器/etc目录下的my.cnf文件即可。具体修改步骤为在[client]项下加入default-character-set=utf8即可。修改后整个文件如下所示:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
#
# 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
#
# 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
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
default-character-set=utf8

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

修改之后,重启mysql容器,重新登录mysql,执行select * from TbUserInfo;,查询结果如下:

mysql> select * from TbUserInfo;
+----+-------------+----------+---------------------+------------+-------------+--------+
| id | accountName | nickName | portraitURL         | birthday   | phone       | gender |
+----+-------------+----------+---------------------+------------+-------------+--------+
|  1 | leebai      | 李白     | localhost:8080/path | 1990-01-01 | 13688449696 | male   |
+----+-------------+----------+---------------------+------------+-------------+--------+
1 row in set (0.00 sec)

可以看到: ??变成了李白,说明配置修改生效。

注意: 运行docker-compose up -d重新部署mysql容器会导致my.cnf中的配置项丢失。T_T

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gorm记一次“mysql写入 Error 1366 (HY000): Incorrect string value”错误 的相关文章

  • 记录 http.ResponseWriter 内容

    Premise 我发现了类似的问题 但不适用于我的情况 因此请不要将其标记为重复 我在 Go 中有一个 HTTP 服务器 并且创建了一个中间件记录请求 响应时间 我也想记录响应 我用过httputil DumpRequest在一个名为的函数
  • go build 不断抱怨:go.mod 有 post-v0 模块路径

    Go 1 11 发布后 我一直在尝试将我的存储库移动到 Go 模块 方法是添加go mod文件在其根目录下 我的根库之一my host root其版本为17 0 1 所以我在其中写道go mod file module my host ro
  • 将 Websocket 消息发送到 Go 中的特定通道(使用 Gorilla)

    我对 Go 很陌生 并且发现自己使用套接字作为我的第一个项目 这是一个多余的问题 但我无法理解如何将 websocket 更新发送到 Go 中的特定通道 使用 Gorilla 我在用此链接中的代码示例 https github com go
  • 如何从java中的字符串时间戳中提取日期和时间

    我正在获取日期和时间String TIMESTAMP来自服务器的 MySQL 格式如下 2014 02 15 05 18 08 我想要的是提取日期DD MM YYYY格式和时间HH MM SS AM PM格式 而且这个时间戳的时区是不同的
  • 命名和未命名类型

    问题 我最近开始阅读Golang规格手册 https golang org ref spec并陷入试图理解的困境有名和无名类型在相关部分 https golang org ref spec Types 我来自动态语言 这让我有点头疼 手册指
  • 使用 MySQL 触发器将所有表更改记录到辅助表

    我有一张桌子 CREATE TABLE data table data id INT NOT NULL AUTO INCREMENT PRIMARY KEY field1 INT NOT NULL field2 INT NOT NULL f
  • Hibernate HQL Join 查询 DOT 节点,没有左侧

    我有两个模型类 应用程序 java Entity Table name Application catalog mysqldb XmlRootElement public class Application extends BaseObje
  • 为什么有时自增列的值会有一个或多个间隙?

    我有一个这样的表 colors id color 1 red 2 blue id column is auto increment PK 当我向该表中插入一些新值时 有时会出现一些间隙id柱子 像这样的事情 INSERT INTO colo
  • 根据多行中的总分对 mysql 中的用户进行排名

    我有与这个问题中描述的非常相似的要求 mysql中的用户按积分排名 https stackoverflow com questions 34637943 rank users in mysql by their points 唯一的区别在于
  • PDO 多查询“SQLSTATE[HY000]:一般错误”

    我仍在学习 PDO 所以我可能会错过一些东西 但基本上我正在尝试将一行插入表中 然后选择生成的 id 我不确定它是否喜欢一个 pdo 语句中的两个查询 这是我用来执行 SQL 的代码 public function ExecuteQuery
  • 如何更改Linux服务器中的MySQL表名不区分大小写?

    我正在开发一个旧网站 该网站曾经托管在 Apple 服务器上 当它迁移到新的 Linux 服务器时 它停止工作 我很确定这是因为 php 脚本中使用的所有 MySQL 查询对于表名都有不同的大小写组合 我不知道为什么原始开发人员在创建表名或
  • MySQL 将日期时间转换为unix时间?

    我有一个 DATETIME 格式的列 我想将其转换为数据库中的 UNIXTIME 那会是什么样的查询 我知道如何从 UNIXTIME 转换为 DATETIME 但我从未做过相反的操作 我用过FROM UNIXTIME 没有TO UNIXTI
  • 无法从另一个标签的源代码构建和安装 go

    我正在尝试使用此从源代码构建和安装 go文档 https go dev doc install source 当我喜欢以下内容时 这效果很好 git clone https go googlesource com go goroot cd
  • 模块路径格式错误...第一个路径元素中缺少点

    我有一个包含 2 个不同可执行文件的项目 每个可执行文件都有自己的依赖项以及对根的共享依赖项 如下所示 Root gt server gt main go gt someOtherFiles go gt go mod gt go sum g
  • 需要 SQL 选择查询帮助

    我的问题类似于SQL选择组查询 https stackoverflow com questions 11407601 sql select group query 但模式发生了变化 我想要不同的结果 如下所述 给定链接的解决方案没有给我正确
  • UTF-8、PHP 和 XML Mysql

    我在解决这个问题时遇到了很大的问题 我有一个编码 latin1 swedish ci 的 mysql 数据库和一个存储名称和地址的表 我正在尝试输出 UTF 8 XML 文件 但在使用以下字符串时遇到问题 Otiv gen它被输出为Otiv
  • MySql 5.7 函数 UUID() 默认排序规则 - 非法混合排序规则

    Problem MySQL uuid 默认排序规则与配置连接排序规则不进行比较 我有一个使用字符集创建的数据库 表 字段 utf 8和排序规则utf8 polish ci my cnf 如下 init connect SET NAMES u
  • SQL 未插入到 Yii 中具有关系的表中

    我正在尝试创建一个用户 但所有值都没有插入到数据库中 Systems user 表与partys 表有关系 因为party id 是sytems user 的主键 没有插入任何内容 甚至没有错误 它只是返回到 创建 页面 这是我的架构 Ta
  • Java 日期和 MySQL 时间戳时区

    我正在编辑一段代码 其基本功能是 timestamp new Date 然后坚持下去timestamp中的变量TIMESTAMPMySQL 表列 然而 通过调试我看到Date显示在正确时区的对象 GMT 1 当持久化在数据库上时 它是GMT
  • 在 Bluemix 中激活 PHP 扩展

    这纯粹是 Bluemix 问题 我的代码在本地主机上顺利运行 但是当我将其迁移到 Bluemix 时 我的数据库连接失败了 检查日志 我发现问题 调用未定义的函数 mysqli init HTTP 响应 500 我发现扩展已被禁用以使其更小

随机推荐

  • 适合零基础学习的IT编程技术

    现在很多应届生 不管是否是计算机专业 都想毕业后从事IT行业 不仅是因为IT行业的薪资高 更主要是IT行业就业需求多 发展好 工作稳定 学IT 技术在手 天下我走 当然 IT行业有很多学科方向 学习哪个方向很重要 选择方向这件事 有时候就是
  • Lenet5实现及代码详解——以MINST数据集为例

    看了卷积神经网络 CNN 的原理及介绍 想着自己动手解决一个案例 在网上也看了很多博客 这里整理一下 顺便记录一下自己解决一个完成的CNN实例的过程 以便以后方便看 如果有不足之处 欢迎大家指正 数据获取与可视化操作 1 下载minst数据
  • Android Audio系统框架

    Audio System 二 之 Audio系统框架 二 Linux Audio系统框架 2 1 Application 层 2 2 Framework 层 2 3 Libraries 层 2 4 HAL 层 2 5 Tinyalsa 层
  • vue3 Failed to resolve component router-view

    Failed to resolve component router view If this is a native custom element make sure to exclude it from component resolu
  • unity常用核心类

    Transform 变换 主要用于控制物体的旋转 移动 缩放 Rotate eulerAngles Vector3 relativeTo Space Space Self void 旋转 游戏对象围绕Y轴旋转 transform Rotat
  • JqGrid实现分页相关

    jqGrid默认就提供了分页的功能 其在实现分页的时候有两个隐含的属性与后台交互及page 当前页 rows 每页显示的数据量 当请求下一页的时候请求数据头部默认包含这两个属性 如图 Page和rows传到后台 后台接收 要实现分页后台必须
  • unity 获取场景所有物体

    转载的 Unity 遍历场景所有物体 包括隐藏及被禁用的物体 用于获取所有Hierarchy中的物体 包括被禁用的物体 private List
  • mysql增加用户

    mysql增加用户 增加用户 注意 和上面不同 下面的因为是MYSQL环境中的命令 所以后面都带一个分号作为命令结束符 格式 grant select on 数据库 to 用户名 登录主机 identified by 密码 第一种 增加一个
  • CM5501高效四开关降压-升压控制器(升降压芯片)

    CM5501 High Efficiency 4 Switch Buck Boost Controller Description CM5501 is a synchronous 4 switch Buck Boost controller
  • elasticsearch-索引与分片实现原理

    添加索引 我们往 Elasticsearch 添加数据时需要用到 索引 保存相关数据的地方 索引实际上是指向一个或者多个物理 分片 的逻辑命名空间 一个 分片 是一个底层的 工作单元 它仅保存了全部数据中的一部分 在分片内部机制中 我们将详
  • InheritableThreadLocal类详解

    我们在使用ThreadLocal类的时候 可以保证各个线程使用自己的数据 而不相互干扰 但是如果我们有这样的一个需求 就是各个线程相互不干扰的情况下 各个线程的子线程可以访问到当前线程中的值 对于这个子线程来说就是访问父线程 public
  • Scrum那些事 - 什么是Scrum?

    1 什么是Scrum Scrum是敏捷开发方法论里面的一个具体实施框架 Scrum是一个包括了一系列的实践和预定义角色的过程骨架 是一种流程 计划 模式 用于有效率地开发软件 Scrum的框架中包含3种角色 3个产出 5个活动和5种价值观
  • 1.业务层 、服务层、数据层、表现层

    一般说来 业务逻辑层中的模块包含了系统所需要的所有功能上的算法和计算过程 并与数据访问层和表现层交互 抽象的说 业务逻辑层就是处理与业务相关的部分 一般来说 业务层包含一系列的执行与数据的操作 例如 开具发票 添加客户或下订单等 服务层就是
  • 《我的眼睛--图灵识别》第十章:实战演练:文字类识别

    我的眼睛 图灵识别 第十章 实战演练 文字类识别 1 标准数字 标准数字 Standard Numbers 是指10个数字使用的都是同属一种字体 它们的数字没有发生变形 没有扭曲 没有错位 存在有些变色但影响不大 字与字之间的间隔距离一样
  • Elasticsearch的简单入门:(二)ES基础

    Elasticsearch的简单入门 一 ES简介与安装 https blog csdn net kavito article details 88289820 前面我们把环境准备好了 下面继续学习ES的索引操作 2 操作索引 2 1 基本
  • Oracle VM VirtualBox安装Ubuntu虚拟机的过程记录

    一 版本信息 操作系统 Windows 10 家庭版 Oracle VM VirtualBox 版本 6 0 10 r132072 Qt5 6 2 Ubuntu 16 04 6 desktop amd64 二 创建过程 开始新建虚拟机 点击
  • 循环结构程序设计-第4关:C循环-水仙花数

    任务描述 本关任务 求出所有的水仙花数 提示 所谓水仙花数是指一个三位数 其各位数字的立方和等于该数字本身 比如153是一个水仙花数 因为153 1 3 5 3 3 3 注意 本题不需要输入语句 由于网站限制要求一定要有输入输出示例 但同学
  • 力扣每日一题【电话号码的字母组合】

    电话号码的字母组合 b站视频 class Solution public vector
  • ChatGPT将彻底改变人们的工作方式

    来源 企业网D1Net 关注公众号 人工智能学派 加入我们社群 免费领取官方chatGPT账号 自从OpenAI公司推出ChatGPT以来 它以风暴般的速度迅速影响了大量用户的日常工作和生活 并且已经通过医学院考试 软件工程师编码面试 律师
  • gorm记一次“mysql写入 Error 1366 (HY000): Incorrect string value”错误

    记一次 mysql写入 Error 1366 HY000 Incorrect string value 错误 环境go gorm docker mysql 写入数据库的内容为中文时提示Error 1366 HY000 Incorrect s