docker搭建的mysql8.0中文乱码问题

2023-11-10

手把手教你如何在mysql 中使用中文编码

1.首先在docker中拉取好一个最新的mysql镜像以后,创建一个容器:

这里写图片描述

docker run  -d -p 13306:3306 -e MYSQL_ROOT_PASSWORD=xxxxxx--name MYDB mysql
 
 
  • 1
参数的解释:
  • -d 设置detach为true
  • -p port 映射端口 13306
  • -e environment 设置密码 xxxxx

2. docker ps 查看mysql容器是否启动,进去容器

这里写图片描述

docker exec -ti xxx(容器id) /bin/bash
 
 
  • 1

理论上应该启动正常 进去容器内部

3.查看mysql密码 是否正常

mysql -u root -p
 
 
  • 1

在提示下输入密码 xxxxx 正常情况下,应该出现以下提示符mysql>

这里写图片描述

!!重点来了!!

1.前期工作 查看当前mysql字符集情况

mysql>SHOW VARIABLES LIKE 'character_set_%';//查看数据库字符集
 
 
  • 1

基本上都如下图所示:默认就是瑞典latin1
这里写图片描述

 SHOW VARIABLES LIKE 'collation_%';
 
 
  • 1

这里写图片描述
图上的第一个 connection 就是我们通过workbench等客户端连接的时候指定的编码。
外部访问数据乱码的问题就出在这个connection连接层上

1.先解决外部访问数据乱码的问题

SET NAMES 'utf8';
 
 
  • 1

它相当于下面的三句指令:

SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
 
 
  • 1
  • 2
  • 3

2.创建数据库,创建表的时候,包括设置字段的时候也要加上字符集设置:

例如

create database MYDB character set utf8;

use JSPDB;
create table  t_product(
pid     varchar(20),
pname    varchar(20),
price    double,
address   varchar(30)
) DEFAULT CHARSET=utf8;

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3.如果你应经有建立了数据库,也可以通过以下语句修改字符集

当然 如果是刚刚建容器的时候 我想你肯定是没有数据库的,所有此步跳过

alter database name character set utf8;#修改数据库成utf8的.
alter table type character set utf8;#修改表用utf8.
alter table type modify type_name varchar(50) CHARACTER SET utf8;#修改字段用utf8
 
 
  • 1
  • 2
  • 3

4.这一步是很重要的来修改配置文件

mysql容器的配置文件在哪呢?
我们进去容器。不输入mysql -u root -p(即登录数据库)
配置文件在etc/mysql/mysql.conf.d/mysql.cnf这个文件里头
这里写图片描述

我们找到这个文件 编辑他vi mysql.cnf,在使用docker容器时键入vim命令时提示:
vim: command not found
这个时候就需要安装vim
这时候需要敲:

apt-get update
 
 
  • 1

等更新完毕以后再敲命令:

apt-get install vim
 
 
  • 1

然后你发现vim 编辑器可以使用以后,在此文件中添加如下字段
在 [mysqld] 标签下加上三行

default-character-set = utf8
character_set_server = utf8
 
 
  • 1
  • 2

在 [mysql] 标签下加上一行

default-character-set = utf8
 
 
  • 1

在 [mysql.server]标签下加上一行

default-character-set = utf8
 
 
  • 1

在 [mysqld_safe]标签下加上一行

default-character-set = utf8
 
 
  • 1

在 [client]标签下加上一行

default-character-set = utf8
 
 
  • 1

修改结果如下:
这里写图片描述

那么如何检验成功了呢?

还记得我们怎么检查mysql字符集编码的吗 ?

SHOW VARIABLES LIKE 'character_set_%';
 
 
  • 1

这里写图片描述
我们发现有很多都变成utf8了

 SHOW VARIABLES LIKE 'collation_%';
 
 
  • 1

这里写图片描述
以上基本的工作都做完了。

那么现在让我们建一个表,看看是否可以读取写入中文了吧!!

咚!!首先我使用的是mysql-workbench客户端
这里写图片描述
我解释一下:

  • connection name:连接名字随便起,这个无所谓
  • hostname:是你的ip地址,如果你是云服务器,你填上自己的公网地址就行(我是某云)
  • port:记得填上你的映射端口号 比如我们例子使用的是:13306
  • username :是root
  • password:你可以先输入上,如果不输入的时候,会提示你输入密码的

你会问哪来的用户和密码 ,你傻了,你创建容器的时候自己设置的,还记得吗?

docker run  -d -p 13306:3306 -e MYSQL_ROOT_PASSWORD=xxxxxx--name MYDB mysql
 
 
  • 1

好,以下是基本的建表啊,数据库啊的语句,我就不展开了,很容易上手!!

create database MYDB character set utf8;
 
 
  • 1
use MYDB;
create table  t_product(
pid     varchar(20),
pname    varchar(20),
price    double,
address   varchar(30)
) DEFAULT CHARSET=utf8;

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
insert into t_product values ("A01","苹果",2.5,"yantai");
 
 
  • 1

后来 我尝试插入多条:

insert into t_product values
("A02","橘子",4.5,"yantai"),
("A03","香江",8.5,"rizhao"),
("A04","彩电",200,"japan"),
("A05","哈哈",13.5,"shandong"),
("A06","你好",8.5,"rizhao"),
("A07","手机",100,"japan"),
("A08","电视",13.5,"linyi"),
("A09","数数",4.5,"yantai"),
("A10","书店",8.5,"rizhao");
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然后你可以尝试将自己建好的表查看一下:

select * from t_product;
 
 
  • 1

这里写图片描述

这样就成功了!!!

如果你还不放心,我们可以尝试运行一个项目试一试哦!我这也不展开讲了!!
我自己的一个JSP项目运行截图:

这里写图片描述


新增:我在使用的过程中,发现在jsp的servlet中使用

ps = conn.prepareStatement("insert into emp(empno,ename,job,sal,deptno) values(?,?,?,?,?)");
 
 
  • 1

首先 我在数据库是事先插入的3条记录,都没有问题,然后再jsp中,明明插入的是中文,但是在数据库中显示乱码
我肯定是:JSP设置的出的问题

这里写图片描述

所以 我给每个servlet设置

request.setCharacterEncoding("UTF-8");
 
 
  • 1

但是并没什么卵用….
你可以试试….

方案1:

首先jsp页面设置编码设置为utf8
<%@ page language=”java” pageEncoding=”utf8”%>
接受对象是中文的时候对其处理
String str=new String(request.getParameter(“name”).getBytes(“ISO-8859-1”),”utf8”);

方案2:

连接数据库时候指定Encoding,我使用的是这个方法解决的
下面是连接数据库的两种不同形式:

DriverManager.getConnection("jdbc:mysql://localhost/SKDB?useUnicode=true&characterEncoding=utf8","root","xxxx");
 
 
  • 1
private static final String DRIVERNAME = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://123.207.149.102:4444/testjdbc?useUnicode=true&characterEncoding=utf8";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "xxxx";
    private static Connection conn = null;
 
 
  • 1
  • 2
  • 3
  • 4
  • 5

这里写图片描述

ok!!问题解决!!!

如果有任何问题,请联系我

邮箱panpan668706@163.com!!!
微信:panpan668706
知乎:大牛带我飞吧
微信公众号:大牛带我飞吧

参考文档:文章1 文章2 文章3

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

docker搭建的mysql8.0中文乱码问题 的相关文章

随机推荐

  • BSN长话短说之六:公链如何破局

    BSN长话短说之六 公链破局 王立新 感谢各位嘉宾抽出宝贵时间参与这次对话 先简单介绍下今天出席对话嘉宾 红枣科技CEO 何亦凡 Nervos联合创始人 吕国宁 分布科技Onchain CEO Neo创始人 达鸿飞 Algorand Fou
  • 真题详解(地址索引)-软件设计(五十一)

    真题详解 单元测试 软件设计 五十 https blog csdn net ke1ying article details 130189173 spm 1001 2014 3001 5501 指令寻址方式 有四种 直接寻址 寄存器寻址 隐含
  • Rest分发监听接口

    Rest分发监听接口 一 Rest分发接口 1 创建目录 2 New XMLSchema File Name 自己根据接口定义名字 Directory 选择自己接口Schema的路径 Target Namespace 这个路径根据要求 Sc
  • 使用xlrd库读取Excel自定义sheet表内容,以字典格式输出

    如题描述 如何根据自定义的worksheet读取工作表内容呢 对于参数化数据时如果能做到这个是有一定好处的 当然也有其他不同路径的处理方法也是可以的 想要过程完美需要时间打磨的呀 今天分享xlrd库的用法 根据自定义的sheet读取表格内容
  • 图文并茂开发AR小游戏全教程(一)

    AR动画可放大缩小平移旋转 可自行下载项目运行到真机上演示 由于项目以及下文用到的素材较大 GItHub 无法上传 故传到百度云LLGameAR 文章目录 一 AR 和 VR 概念 二 软件简介 Unity 3D Vuforia SDK 三
  • mybatis中resultmap与resulttype区别

    resultmap与resulttype的区别为 对象不同 描述不同 类型适用不同 一 对象不同 1 resultmap resultMap如果查询出来的列名和pojo的属性名不一致 通过定义一个resultMap对列名和pojo属性名之间
  • 编译ARM版本mosquitto-1.6.8

    编译前提依赖 需下载 c ares 1 14 0 下载源码 wget c https c ares haxx se download c ares 1 14 0 tar gz 解压源码 tar zxvf c ares 1 14 0 tar
  • Redis之《狂神说》学习笔记

    一 Nosql 1 为什么使用Nosql 大数据时代 普通的数据库无法进行数据分析 Hadoop 2006 历史发展 1 单机MySQL时代 90年代 一个网站的访问量一般不会太大 单个数据库完全够用 问题 数据量增加到一定程度 单机数据库
  • OTA测试方法解析

    目前 标准的OTA测试系统是SISO 单输入 单输出 如主流的2G 3G和WLAN的802 11a b g等设备 其主要的测试指标是TRP 总辐射功率 和TIS 总全向灵敏度 现代无线技术如LTE HSPA WI FI和WiMAX为了提高数
  • 点云配准、拼接概念综述

    点云扫描设备在对环境进行扫描时 往往不能在同一坐标系下将环境的点云数据一次性测量 其原因是环境大小超过了扫描设备的测量范围 并且环境里的物体之间相互遮挡 点云扫描设备在一个角度不太可能扫描到物体的完整点云 得到多片点云数据后 我们需要一种技
  • File targeting 'AMD64' is not compatible with the project's target platform 'x86' 解决方法

    我在使用vs2010制作64位安装包时出现了以下问题 File targeting AMD64 is not compatible with the project s target platform x86 Error File NGlb
  • 【零基础学QT】文章导航篇

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏目录 零基础学QT 文章导航篇 专栏资料 https pan baidu com s 192A28BTIYFHmixRcQwmaHw 提取码 qtqt 点
  • STM32 同一定时器 两个通道捕获输入

    上一个帖子 看到有人在评论区问我代码 那我在这里贴一下吧 有需要的收藏 这是定时器 通道2 通道3的写法 定时器2中断服务程序 void TIM2 IRQHandler void if TIM2CH2 CAPTURE STA 0X80 0
  • 神秘的HVV到底是什么?

    1 什么是HVV行动 HVV行动 是国家应对网络安全问题所做的重要布局之一 是由政府统一组织的 网络安全实战攻防演习 通过与进攻方的对抗 企事业单位网络 系统以及设备等的安全能力会大大提高 2 发展 HVV行动 从2016年开始 随着我国对
  • 复盘:第一次面向研发的技术写作培训

    上周我完成了第一次真正意义上的 面向研发人员的技术写作培训 作为一只 在公共场合讲话紧张得要死的人类 整个过程 竟然自我感觉表现得很不错 培训后也收到了研发同事积极 鼓励的反馈 朋友们 我感觉自己膨胀了啊 飘了啊 这么说 恐怕是有点臭屁啦
  • 【Python小游戏】Python实现井字棋游戏

    实现过程 类TicTacToe的构造函数 init 初始化棋盘board和当前玩家current player print board 方法用于打印当前的棋盘 make move row col 方法用于让当前玩家落子 check win
  • 电子信息工程专业毕设题目汇总100例

    文章目录 1前言 2 如何选题 2 1 嵌入式开发方向 2 2 物联网方向 2 3 移动通信方向 2 4 人工智能方向 2 5 算法研究方向 2 6 移动应用开发方向 2 7 网络通信方向 2 8 学长作品展示 4 最后 1前言 近期不少学
  • xCode运行出现“Executable Not Found“的解决办法

    这个是由于部分代码文件或plist等没有被导入 无法生成二进制执行文件导致 解决办法 请仔细检查所有代码文件有无完整导入 请仔细检查所有代码文件有无完整导入 请仔细检查所有代码文件有无完整导入
  • HTML中关于边框(border)的使用

    同时设置上下左右边框 border 宽度 样式 颜色 其中颜色可以省略 默认黑色 样式不能省略分别设置上右下左边框 1 border top 宽度 样式 颜色 顶部 border right 宽度 样式 颜色 右边 border botto
  • docker搭建的mysql8.0中文乱码问题

    手把手教你如何在mysql 中使用中文编码 1 首先在docker中拉取好一个最新的mysql镜像以后 创建一个容器 docker run d p 13306 3306 e MYSQL ROOT PASSWORD xxxxxx name M