C++ MySQL Error 1366 incorrect string value引发的认识

news2024/9/23 11:28:13

C++ MySQL Error 1366 incorrect string value引发的认识

前言

在使用MySQL C++ API编写程序时,由于用到了中文,导致出现了MySQL error 1366 incorrect string value 问题,但令我同样不解的是我用同样的语句在cmd下可以正常执行。(MySQK1366 报错如下如下:
在这里插入图片描述

虽然可以很容易发现时字符集编码的问题,也确实是这个问题,这也是第一次编写程序遇到,虽然找问题解决方法很痛苦,但对字符集编码以及跨平台有了更深的了解。

正文

在编写代码初始化数据库,设置字符集时,我认识到了把MySQL的utf8并不是我们普遍认为的utf8, 实际意义上应该是utf8mb4。起初我以为是MySQL的字符集编码设置有问题,甚至到表,字段的字符集都检查了但都没有问题,而且谷度也基本也没搜到有用的信息,大都是认为是数据库的字符集有问题。在这个过程中,我利用配置文件my.ini把数据库的相关编码都设置为了utf8mb4,这也许是导致我之前可以在命令行执行,后来却执行不了的原因。下面是关于几个系统变量的说明。

系统变量描述
character_set_client客户端来源数据使用的字符集
character_set_connection连接层字符集
character_set_database当前选中数据库的默认字符集
character_set_results查询结果字符集
character_set_server默认的内部操作字符集

然后问题终于有了突破性的进展。在处理问题的途中,我也得知了cmd下使用的是GBK中文编码。随后我又猜想是执行的语句不是utf8(实际的utf8)格式的原因(与character_set_client不符),所以我使用chcp 65001使得cmd下字符集设置为utf8,经过两个命令行窗口进行对比,果然是这个原因,utf8这边正常执行语句,进行正常显示,而原GBK这边,往字段中插入中文就会报错,同时之前原有的中文记录也出现乱码。另外MySQL 也提供了Command Line Client -Unicode 的窗口,在这下面执行,也符合mysql 的utf8mb4,所以也正确执行和显示。

最后,通过上面的验证,我把问题最后锁定在了代码中SQL语句的字符集问题上,随后我又经过一顿搜索,得到了如下字符串std::string转换为utf8模式得函数。

std::string StringToUTF8(const std::string& gbkData)
    {
        const char* GBK_LOCALE_NAME = "CHS";  //GBK在windows下的locale name(.936, CHS ), linux下的locale名可能是"zh_CN.GBK"

        std::wstring_convert<std::codecvt<wchar_t, char, mbstate_t>>
            conv(new std::codecvt<wchar_t, char, mbstate_t>(GBK_LOCALE_NAME));
        std::wstring wString = conv.from_bytes(gbkData);    // string => wstring

        std::wstring_convert<std::codecvt_utf8<wchar_t>> convert;
        std::string utf8str = convert.to_bytes(wString);     // wstring => utf-8

        return utf8str;
    }

所以最终的解决方法是,通过执行sql语句前多加一层字符集的转换,问题都到了解决。花费了一晚上时间,此时这篇文章到此时间为2022.12.09.23:55,OK,完事,上床睡觉。

补充

通过这个问题,我对字符集有了一些新的认识(可能并不恰当)。

我认为问题的主要原因是系统变量character_set_client与实际数据使用的字符集不匹配所导致。验证如下,在不改变命令行窗口的字符集的情况下(默认GBK),通过改变character_set_client的值,对比执行是否成功,更加验证了我的猜想。
在这里插入图片描述

同样输出乱码则和系统变量character_set_results与实际显示数据的字符集不匹配有关。验证如下。

在这里插入图片描述

总之,输入要和character_set_client字符集匹配,显示要和character_set_results字符集匹配,即我们的命令行窗口字符集要和character_set_client以及character_set_client相同。

通俗来说,character_set_client ,这是用户告诉MySQL查询是用的什么字符集。character_set_connection ,MySQL接受到用户查询后,按照character_set_client将其转化为character_set_connection设定的字符集。character_set_results , MySQL将存储的数据转换成character_set_results中设定的字符集发送给用户。set names xxx等同于同时设置这三个。

此三处的字符设定很大程度上会解决乱码问题,那么着三个设定具体有什么作用呢?

character_set_client指定的是Sql语句的编码,如果设置为 binary,mysql就当二进制来处理,character_set_connection指定了mysql 用来运行sql语句的时候使用的编码,也就是说,程序发送给MySQL 的SQL语句,会首先被MySQL从character_set_client指定的编码转换到character_set_connection指定的编码,如果character_set_clien指定的是binary,则MySQL就会把SQL语句按照character_set_connection指定的编码解释执行.
当执行SQL语句的过程中,比如向数据库中插入字段的时候,字段也有编码设置,如果字段的编码设置和character_set_connection指定的不同,则MySQL 会把插入的数据转换成字段设定的编码。SQL语句中的条件判断和SQL插入语句的执行过程类似.
当SQL执行完毕像客户端返回数据的时候,会把数据从字段指定的编码转换为character_set_results指定的编码,如果character_set_results=NULL 则不做任何转换动作,(注意这里设置为NULL不等于没有设置,没有设置的时候MySQL会继承全局设置),
工作中比较有用的就是利用MySQL进行转码、不同编码的数据库之间共用数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法】动态规划 ⑤ ( LeetCode 63.不同路径 II | 问题分析 | 动态规划算法设计 | 代码示例 )

文章目录一、问题分析二、动态规划算法设计1、动态规划状态 State2、动态规划初始化 Initialize3、动态规划方程 Function4、动态规划答案 Answer三、代码示例LeetCode 63. 不同路径 II : https://leetcode.cn/problems/unique-paths-ii/ 一个机器人位于一个 m x n 网格的左上…

java初步学习 String(基于小李的课进行自学,初学者)12

初步学习 String 基本概念 String类型即为字符串类型&#xff0c;即“103”&#xff0c;“abc”,"小陈"等字符类型&#xff0c;在工作中可用于加密&#xff0c;替换&#xff0c;截取&#xff0c;查找等工作 不过这种名词显然不能联想到工作的实际样子 例&#xff1a;…

[附源码]Python计算机毕业设计SSM基于框架的旅游订票系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

IIS 之 添加MIME扩展类型及HTTP错误403

IIS 之 添加MIME扩展类型及HTTP错误403 我是艾西今天跟大家分享下IIS添加MIME及HTTP报错403 经常用IIS作为下载服务器的时候有时传上去的文件比如 example.mp4 文件名上传后&#xff0c;但是用http打开的时候确显示为 404 文件不存在。其实是IIS对文件的一种保护&#xff0c;…

基于java+springboot+mybatis+vue+mysql的校园志愿者管理系统

项目介绍 本校园志愿者管理系统以springboot作为框架&#xff0c;前端vue技术&#xff0c;b/s模式以及mysql作为后台运行的数据库&#xff0c;同时使用Tomcat用为系统的服务器。本系统主要包括首页、个人中心、志愿者管理、活动类型管理、活动信息管理、活动报名管理、活动通知…

游戏开发49课 性能优化7

4. 渲染优化 渲染优化的目的是减少Draw Calls&#xff0c;减少渲染状态切换开销&#xff0c;降低显存占用&#xff0c;降低带宽和GPU负担。在讲解渲染优化之前&#xff0c;先了解渲染性能消耗点。 Draw Call数量 Draw Call有些引擎也称为SetPass Call。一个Draw Call就是游戏调…

叫ChatGPT用html+css+js写一个圣诞节代码,看看什么样子?

最近ChatGPT这么火&#xff0c;那就让他给我写点代码吧。 如何注册一个账号&#xff0c;参考&#xff1a;注册ChatGPT详细指南 注册不了的小伙伴们&#xff0c;咱们评论区见&#xff0c;问一个最想问的问题&#xff0c;看到就给你回复&#xff01; 我已经注册好了&#xff0c;…

代码随想录算法训练营第五十九天|503.下一个更大元素II、42. 接雨水

LeetCode 503.下一个更大元素II 链接&#xff1a;503.下一个更大元素II 思路&#xff1a; 本题其实和739. 每日温度更像一点&#xff0c;因为本题只有一个数组&#xff0c;而在下一个更大元素I中有两个&#xff0c;因此必须要一个哈希表来在另一个数组中查找相对应的数字。除…

yolov5检测结果不显示

安装完yolov5后&#xff0c;运行各种正常&#xff0c;后台也能显示识别信息&#xff0c;像这样。 而且在runs/detect/exp4文件夹中也会有正确的标识 但是我也想能在前台实时显示&#xff0c;像这样。 折腾了一个晚上也没有搞的定&#xff0c;甚至一度以为&#xff0c;是因为CPU…

SSM甜品店系统计算机专业毕业论文java毕业设计开题报告

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 计算机毕业设计java毕设之SSM甜品店系统-IT实战营_哔哩哔哩_bilibili项目资料网址: http://itzygogogo.com软件下载地址:http://itzygogogo.com/i…

【MindStudio训练营第一期】【昇腾AI训练营新手班学习笔记】可视化流程编排

准备 配置环境理解Python代码部分mxVision用户指南一份 步骤 案例的流程图&#xff1a; 图像输入和图像预处理 图像输入&#xff08;appsrc插件&#xff09; 通过python open和read到的图片数据&#xff0c;用SendData方法传入stream中&#xff0c;appsrc将数据发送给下游元…

《操作系统》期末考试卷3参考答案

《操作系统》期末考试卷&#xff08;第3套&#xff09; 参考答案与评分标准 一、单项选择题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 题号 1 2 3 4 5 6 7 8 9 10 答案 D D C A C B A A B A 二、填空题&#xff08;共8题&#xff0c;每空1分&…

Java学习之toString方法

目录 toString方法的功能 Object类的toString方法 源代码 子类没有重写的案例 子类重写toString 使用AltInsert自动重写 输出结果 最后一条 例子 toString方法的功能 返回该对象的字符串表示。默认返回&#xff1a;全类名&#xff08;包名类名&#xff09;哈希值的十六进…

【云服务器 ECS 实战】ECS 快照镜像的原理及用法详解

一、ECS 快照1. 阿里云 ECS 快照概述• ECS 增量快照机制2. 快照服务的开通与使用• 开通快照与 OSS 资源包的购买• 手动快照• 自动快照二、ECS 镜像1. 阿里云 ECS 镜像概述2. 自定义镜像的创建与使用• 导入镜像• 自定义镜像一、ECS 快照 1. 阿里云 ECS 快照概述 阿里云快…

[ Linux ] 进程信号递达,阻塞,捕捉

目录 1.core dump字段 1.1 Core dump是什么&#xff1f; 1.2 用代码看看Core Dump 1.3 core dump的作用 core dump一般会被关掉 2.阻塞信号 2.1 信号其他相关常见概念 2.2在内核中的表示 3.信号产生中 3.1 sigset_t 3.2信号集操作函数 3.2.1 sigprocmask 3.2.2 si…

Carla学习2:carla安装与使用

文章目录0. 建议1. carla学习相关链接1.1 官方资料1.1 学习教程2. Carla安装2.1 服务器端2.1.1 下载预编译版本&#xff08;也可以使用下载源码并编译&#xff09;2.1.2 启动服务器端及服务器端显示导航2.3 客户端2.3.1 创建python环境2.3.2 安装carla 的pythonAPI所需要的依赖…

自动平移门风淋室——化妆品行业的全面自动化门体

自动平移门风淋室工作原理&#xff1a;自动平移门风淋室包括单人风淋室,双人风淋室,多人风淋室,全不锈钢风淋室,快速卷帘门风淋室,防爆风淋室,风淋通道、转角风淋室、钢板烤漆风淋室, QS认证风淋室,全自动风淋室,臭氧杀菌风淋室,电加热风淋室,防静电风淋室,化妆品行业风淋室,汽…

一万五字的文章,超详细的画图,带你理解链表的基础和进阶题目(含快慢指针的讲解)

在今天的文章中&#xff0c;我将带来链表的面试题。在数据结构的学习过程中&#xff0c;画图是尤为重要的&#xff0c;所以在这些题目的讲解的过程中&#xff0c;我以画图为主。温馨提示:由于图片过大&#xff0c;手机观看可能出现模糊不清的情况&#xff0c;建议在电脑观看该篇…

Redis【10】-Redis发布订阅

简介 Redis 发布订阅(pub/sub)是一种消息通信模式&#xff1a;发送者(pub)发送消息&#xff0c;订阅者(sub)接收消息。 Redis 客 户端可以订阅任意数量的频道。 Redis 发布订阅(pub/sub)是一种消息通信模式&#xff1a;发送者(pub)发送消息&#xff0c;订阅者(sub)接收消息。 R…

R-CNN系列目标检测算法对比

引言 对比了R-CNN&#xff0c;Fast R-CNN&#xff0c;Faster R-CNN&#xff0c;Mask R-CNN目标检测算法的发展过程与优缺点。 R-CNN R-CNN是第一个成功第将深度学习应用到目标检测的算法。后面的Fast R-CNN&#xff0c;Faster R-CNN都是建立在R-CNN的基础上的。 R-CNN的检测…