首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

技术分享 | 为什么我的 MySQL 客户端字符集为 latin1

问题背景 我司某客户最近在检查一批新安装的 MySQL 数据库时,发现了下面的现象: 该批次的 MySQL 客户端字符集全部为 Latin1 ; 而之前使用同样参数模板部署的 MySQL ,客户端字符集却为...utf8 ; 已知 MySQL 版本为 5.7.32 ,服务器操作系统为 Redhat 7 ,那么为什么两次安装的 MySQL 字符集会不一样呢?...en_US ,而原先的为 en_US.UTF-8 [qinguangfei0511-4.png] 好像找到了问题出在哪里,测试环境验证下,果然当服务器字符集设置为 en_US 后,MySQL 客户端字符集变为了...Latin1 [qinguangfei0511-5.png] 那么,为什么会这样呢,我们看下官方文档上是怎么说的:https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html...,MySQL 5.7 是 latin1 ,MySQL 8.0为 utf8mb4 ; 每个客户端工具都会检测操作系统的字符集,比如Linux系统LANG环境变量的值,如果MySQL支持操作系统的字符集,就会使用操作系统的

2K30

技术分享 | 为什么我的 MySQL 客户端字符集为 latin1

问题背景 我司某客户最近在检查一批新安装的 MySQL 数据库时,发现了下面的现象: 该批次的 MySQL 客户端字符集全部为 latin1 ; 而之前使用同样参数模板部署的 MySQL ,客户端字符集却为...utf8 ; 已知 MySQL 版本为 5.7.32 ,服务器操作系统为 Redhat 7 ,那么为什么两次安装的 MySQL 字符集会不一样呢?...=utf8mb4 最后,又查看了服务器上操作系统的字符集,发现有问题的为 en_US ,而原先的为 en_US.UTF-8 好像找到了问题出在哪里,测试环境验证下,果然当服务器字符集设置为 en_US...后,MySQL 客户端字符集变为了 latin1 那么,为什么会这样呢,我们看下官方文档上是怎么说的:https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html...,MySQL 5.7 是 latin1 ,MySQL 8.0 为 utf8mb4 ; 每个客户端工具都会检测操作系统的字符集,比如 Linux 系统 LANG 环境变量的值,如果 MySQL 支持操作系统的字符集

1.4K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    面试官:告诉我为什么static和transient关键字修饰的变量不能被序列化?

    一、写在开头在上一篇学习序列化的文章中我们提出了这样的一个问题:“如果在我的对象中,有些变量并不想被序列化应该怎么办呢?”...当时给的回答是:不想被序列化的变量我们可以使用transient或static关键字修饰;transient 关键字的作用是阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient...当时没有解释具体为什么static和transient 关键字修饰的变量就不能被序列化了,这个问题实际上在很多大厂的面试中都可能会被问及。我们今天在这篇中进行解释吧。...然后最后一步的defaultWriteFields()方法中,会去调用ObjectStreamClass对象,里面有个方法为getDefaultSerialFields(),提供了可以被序列化的属性值。...四、总结好啦,今天针对为什么static和transient关键字修饰的变量不能被序列化进行了一个解释,下次大家在面试的时候再被问道就可以这样回答啦,不过,还有的BT面试官会问transient关键字修饰的变量真的不能被序列化吗

    19920

    学 Guava 发现:不可变特性与防御性编程

    问:它被设计为不可变的好处有哪些呢? 答: 节约内存 大家都知道,编程的时候,String 类是大量被使用的(试着用 VisualVm 等工具分析堆,你会发现永远char[] 类型是占用空间最多的。...这样,多个变量,可以共用一个常量池地址,节约了内存。 线程安全 常说实现线程安全的方法之一就是使用final关键字将变量修改为常量,那么为什么不可变的常量是线程安全的呢?...Period类重设计 public Period(Date start, Date end) { //防御性拷贝:构造一个新Date对象,这样,这个内部的start变量和外面的那个start变量将没有任何联系...JAVA 设计:我感受到的防御性编程 1、String、Integer 等的不可变特性 原因上面已经说明了!...返回一个继承了List接口的轻量级“视图”不失为一个好的设计方式。而直接返回数组则是不安全的选择。 3、不可变集合的各种实现 为什么需要不可变集合?

    54640

    Python 装饰器

    就算如此,重命名依然很简单,因为函数也是对象,对象赋给一个变量没问题,所以只要一个简单的赋值即可:cop = caculation_of_pi。这里需要注意:最右边没有括号!...确实没有错,但是万一内部调用的函数我不确定那该怎么办?...不要认为这种事情遇不到,比如编写一个求定积分的函数,我们就需要传入被积函数作为参数,因为不知道被积函数是什么,不能像刚刚说的那样直接调用了,必须把被积函数作为参数传递了,下面我就来编写一个求定积分的函数...很接近我们用牛顿莱布尼茨公式算出来的结果 1/3,为什么是很接近而不是就是?因为 dx 还可以更小(dx 越接近 0,结果就越精确),同时还因为浮点数计算机无法精确表示。...这里我把返回的函数 wrapper 参数设置为适用于一切函数的万能参数,为了提高复用性。下面来调用测试一下,调用过程很简单。

    39530

    【MySQL】存储过程

    文章目录 为什么使用存储过程 书写基本格式 关于参数 存储过程中开启事务 返回多个结果集 设置变量 存储过程:一段SQL语句的集合 为什么使用存储过程 1、解耦合。...$ delimiter ;  #将语句的结束符号恢复为分号 调用的时候就: call login(参数) 关于参数 IN输入参数:表示调用者向过程传入值(传入值可以是字面量或变量) OUT输出参数:...表示过程向调用者传出值(可以返回多个值)(传出值只能是变量) INOUT输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量) 一般我只用 IN,out 什么?...但是目前我还没有找到C++接收其他结果集的方法。 分支循环啥的我也没有用过,所以也就不写在里面啦。后面整批量插入的时候应该要用到,用到再补吧。...设置变量 在存储过程中如果要设置变量: declare 变量 数据类型; create procedure booktickets_CP(in id_ int, in cid_ int, in site

    7.9K30

    C++:Vector的模拟实现

    ,所以匿名对象的生命周期被延长到和val一样,但是由于匿名对象是一个临时变量,所以具有常性,所以必须用const修饰的val才可以当他的别名,否则会出现权限放大!!...3.非法的间接寻址是为什么? 如下图我传(10,5),会出非法间接寻址  但是我传(10u,5)就可以正常使用了,为什么会这样??...看似好像没有什么问题,但是如果把pushback(5)去掉  为什么会这样呢? 原因就是扩容后空间变了,但是pos还是指向原来的空间!!...pos 刚好是 end 的位置,而 end 位置是没有元素的,那么 pos 就失效了。... Self;//Ref单纯是为了控制解引用的时候是否可以被写 //利用反向迭代器的类来封装正向迭代器,同时在类里面设置反向迭代器的行为 ReverseIterator

    10610

    一个printf(结构体指针)引发的血案

    我把发来的测试代码进行验证,思考好久也无法解释为什么会出现那么奇怪的打印结果。 为了整理思路,我到阳台抽根烟。晚上的风很大,一根烟我抽了一半,风抽了一半,可能风也有自己的烦恼。...这就说明 printf 语句在执行时没有改变指针变量的指向地址。 3.2 打印一个结构体变量 既然在字符串上测试没有问题,那么问题就出在结构体类型上了。...但是我还是有点不死心,既然是未定义的行为,那么为什么每次打印输出的结果都错的这么一致呢?既然是由编译器的实现决定的,那么我使用的这个 gcc 版本内部是怎么来打印结构体变量的呢?...: arg = (char *)0; 这就好理解了,直接把指针 arg 设置为空。...因为栈中的所有动态参数被提取后,arg 的值为 0x01020310(最后一个参数的上一个地址),如果不设置为 NULL 的话,下面使用的话就得到未知的结果,为了防止误操作,需要设置为NULL。

    90520

    awk从放弃到入门(9):awk数组详解

    大家好,又见面了,我是你们的朋友全栈君。 这篇文章中的知识点是建立在前文的基础上的,如果你还没有掌握前文中的知识,请先参考之前的文章。...图片 如上图所示,上例数组中的第5个元素的值被设置为了”空字符串”,当我们打印数组中的第5个元素的值时,打印出的值就是”空”(注:”空格”不为”空”)。 为什么要举这个例子呢?...答案是必须的,但是如果我们想要实现这样的效果,需要借助于split函数,而我们还没有介绍过函数,所以此处就先跳过了,不过需要提前说明的是,通过split函数生成的数组的下标默认是从1开始的,这就是为什么之前说...在awk中,我们可以进行数值运算,示例如下 图片 我们将变量a的值设置为1,进行加法计算,每次自加后,再次打印变量a的值,都会加1 这并不难理解,因为上例中,a的值本来就是一个数字。...,count[“192.168.1.1”]的值已经被赋值为1了。

    73340

    一个printf(结构体指针)引发的血案

    我把发来的测试代码进行验证,思考好久也无法解释为什么会出现那么奇怪的打印结果。 为了整理思路,我到阳台抽根烟。晚上的风很大,一根烟我抽了一半,风抽了一半,可能风也有自己的烦恼。...这就说明 printf 语句在执行时没有改变指针变量的指向地址。 3.2 打印一个结构体变量 既然在字符串上测试没有问题,那么问题就出在结构体类型上了。...但是我还是有点不死心,既然是未定义的行为,那么为什么每次打印输出的结果都错的这么一致呢?既然是由编译器的实现决定的,那么我使用的这个 gcc 版本内部是怎么来打印结构体变量的呢?...: arg = (char *)0; 这就好理解了,直接把指针 arg 设置为空。...因为栈中的所有动态参数被提取后,arg 的值为 0x01020310(最后一个参数的上一个地址),如果不设置为 NULL 的话,下面使用的话就得到未知的结果,为了防止误操作,需要设置为NULL。

    71520

    Objective-C属性(property)的特性(attribute)

    它能保证:即使多个线程「同时」访问这个变量,atomic会让你得到一个有意义的值(valid value)。但是不能保证你获得的是哪个值(有可能是被其他线程修改过的值,也有可能是没有修改过的值)。...如果对象A被销毁,所有指向对象A的弱引用(weak reference)(用weak修饰的属性),都会自动设置为nil。...后, nameCopy: Antony; nameNonCopy: Antony.Wong 我只是修改了nameString,为什么testClass1.nameNonCopy的值没改,它也跟着变了?...assign 是非ARC时代的特性, 它的作用和weak类似,唯一区别是:如果对象A被销毁,所有指向这个对象A的assign属性并不会自动设置为nil。...如果设置为null_resettable,则要重写setter或getter其中之一,自己做判断,确保真正返回的值不是nil。

    2K30

    Linux-程序替换

    \n"); return 0; }   能够清晰观察到,在begin之后,程序被替换为了ls 指令,并且选项为 -al,执行程序,发现运行成功了,但是仔细观察之后,在execl之后的printf...结论1: 程序在执行完exec* 的接口之后,是不会再执行后续的代码了,因为后续代码已经被替换。   ...我们来思考一个问题:程序替换为什么对父进程没有影响?这是因为,进程具有独立性,在程序替换的时候发生写时拷贝。...而现在我想 设置全新的环境变量给子进程,这个时候我们就需要用到带有 ‘e’ 字符的接口了  接口中还存在带 ‘e’ 字符的接口,e表示的就是 env:const char* env[], 也就需要 环境变量表...其实这是以 覆盖 的方式来传递环境变量,也就相当于子进程设置了全新的环境变量了。   我在最前面总共列举了七个接口,一个程序替换为什么会有这么多的接口呢?

    11710

    【Linux】进程地址空间

    ) 10 { 11 //child 12 while(1) 13 { 14 printf("我是子进程,我的pid是:%d,我的ppid...,不影响另一个进程的变量 value通过写时拷贝变成两个变量,打印不同变量的地址时,应该是两个变量的地址,那为什么显示是相同的呢?...,对线性区域进行指定start和end即可完成区域划分 从而说明进程地址空间就是一个线性区域 地址空间上的虚拟地址,一个地址表示一个字节,即虚拟地址地址空间的宽度代表为字节 cpu与内存链接的线称之为系统总线...,每个地址对应一个字节 地址空间是线性结构的 4.确定地址空间 32位下地址空间默认为0-42亿多 假设空间范围为4GB 设置进程地址空间的结构 struct mm_struct { int code_start...扩展1:为什么地址空间要存在? 如果没有地址空间,操作系统如何工作 ?

    3K10

    一次对mysql源码审计的尝试(xpath语法错误导致的报错注入)

    myxpathparse函数的参数取自&xpath也即MY_XPATH,xp为一个字符串变量。...#lex-> beg和lex-> end设置为开始和令牌的末尾。...语法出现意外的行尾、没有结束引号或未知字符等不符合xpath语法的时候就会设置令牌结束和令牌类型为MYXPATHLEX_ERROR,即 #defineMY_XPATH_LEX_ERROR'A' 令牌类型...这两个xml函数在以xpath语法为基础的代码实现过程中, 对错误场景(出现意外的行尾、没有结束引号或未知字符集的情况下),设置令牌类型了为A, 这与扫描令牌函数myxpathparseterm的默认参数...在错误处理流程中,myprintf_error函数直接将错误场景下的错误xpath语法抛出到错误信息中, 由于其设置了格式化输出,当精心构造的‘错误的xpath语法’被抛出的时候,成为了一个可以控制的注入点

    2.1K20

    41. 最大子数组

    样例: 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 要求时间复杂度为O(n) 想了一会并没有特别好的方法,想了一个用双指针的方法,...基于这三种情况分析,我们可以采用这样的思路,先设置一个max,把这个数设置为INT_MIN,设置sum作为变量来记录当前得到的字数组的和,一旦sum>max,就可以更新max,这样就能保证max是最大字数组的和...这样说来不是很直观,我们可以注意这样一个事实:我们要找的子数组的前面的几个数(不管是几个),和肯定不能是负的,如果是负的,那么去掉岂不是得到的和更大,这样就能理解为什么一旦发现前面的字数组为负的话,就丢掉...(不能同时剔除两个‘比如[-1,-3,-1]',如果同时剔除两个1,得到的最大值可能是-3,实际上是-1,但是同时被剔除掉了),我是用这个方法试了一些数据,感觉还挺靠谱,于是写了一下,中间用迭代器的程序还不对...res_max; // write your code here } ---- 振哥指导了一个思路说是当两端相同的话,任意去掉一个是不明智的,后来我想了一下确实是这样的,因为如果恰好有一个就是最大子数组之列又恰好被去掉呢

    73110

    backbond Model方法(set)

    ); //设置error信息为用户定义的validate返回值 var error = this.validationError = this.validate(attrs, options..._changing就是false,那么无论如何,changing都是false,为什么还要设置一个changing变量呢? 分析源码的最大一个好处就是,他的代码肯定不是没有意义的!...也就是调用了一次console.log(++z);因为设置了changing变量,在model.set({b:true})时,因为之前调用了model.set({a:true}),changing变量处于..._pending为false时,不执行this.trigger('change', this, options);语句。 所以这里的changing变量和while语句就是为了避免事件嵌套。..._pending被置为options的值,函数在这里返回,重新回到调用model.set({a:true})的while循环,此时根据while循环,它在一次执行了while里面的语句,同样,在调用change

    52330

    一文读懂JAVA多线程

    多选 A:a=0,b=1 B:a=1,b=0 C:a=0,b=0 D:a=1,b=1 上边这段代码不太好调,然后我稍微改造了一下。...,然后两个线程同时启动分别设置a=1,x=b和b=1,y=a。...结果看截图 [1590386985366059976.png] 因为我没有记录循环次数,不知道循环了几次,然后触发了条件break了。...从代码上看,在输出A之前必然会把B设置成1,在输出B之前必然会把A设置为1。那为什么会出现同时是零的情况呢。这就很有可能是指令被重排序了。...[1590387009702007500.png] 从上图可以看出,在cas指令修改变量值的时候,先要进行值的判断,如果值和原来的值相等说明还没有被其它线程改过,则执行修改,如果被改过了,则不修改。

    45720

    一文读懂JAVA多线程

    一般对应的程序的操作就是从数据库查数据到内存然后到CPU进行计算。这个描述有点粗,下边画个图。 ? 业内画这个图一般都是画的金字塔型状,为了证明是我自己画的我画个长方型的(其实我不会画金字塔)。...多选 A:a=0,b=1 B:a=1,b=0 C:a=0,b=0 D:a=1,b=1 上边这段代码不太好调,然后我稍微改造了一下。...,然后两个线程同时启动分别设置a=1,x=b和b=1,y=a。...因为我没有记录循环次数,不知道循环了几次,然后触发了条件break了。从代码上看,在输出A之前必然会把B设置成1,在输出B之前必然会把A设置为1。那为什么会出现同时是零的情况呢。...从上图可以看出,在cas指令修改变量值的时候,先要进行值的判断,如果值和原来的值相等说明还没有被其它线程改过,则执行修改,如果被改过了,则不修改。

    40510
    领券