最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL insert 記錄后查詢亂碼問(wèn)題解決方法

 更新時(shí)間:2024年11月15日 09:39:34   作者:種樹(shù)人20240819  
文章通過(guò)分析一個(gè)MySQL插入數(shù)據(jù)后查詢亂碼的問(wèn)題,探討了亂碼的原因,并提出了解決方法,問(wèn)題的根本原因是MySQL客戶端和服務(wù)器之間的字符集不一致,導(dǎo)致插入的中文字符被錯(cuò)誤解碼為亂碼,感興趣的朋友跟隨小編一起看看吧

問(wèn)題現(xiàn)象

后臺(tái)應(yīng)用程序使用的是云上的 MySQL 服務(wù),需要給 MySQL 數(shù)據(jù)表里 insert 一些數(shù)據(jù),平時(shí)都是先運(yùn)行一個(gè) MySQL 的 pod:

kubectl run mysql-client --rm -it --restart='Never' --image mysql:5.7 --command -- env LANG=C.UTF-8 mysql -hx.x.x.x -uusername -ppassword

然后將 insert SQL 文件復(fù)制到 MySQL pod 里面,在 MySQL pod 中執(zhí)行 source SQL 文件命令。這次 insert 數(shù)據(jù)時(shí)發(fā)現(xiàn)環(huán)境上已經(jīng)有運(yùn)行的 MySQL pod了,就將 SQL 文件復(fù)制到已運(yùn)行的 MySQL pod中,然后通過(guò)命令進(jìn)入到MySQL pod里,再連接到云上 MySQL:

kubectl exec -it mysql-client -- bash
mysql -hx.x.x.x -uusername -ppassword

接著執(zhí)行 source SQL文件,然后通過(guò)前端頁(yè)面查看錄入的數(shù)據(jù),發(fā)現(xiàn)是亂碼。但是在執(zhí)行 source 命令的 MySQL 客戶端 select 查詢錄入的數(shù)據(jù)卻是預(yù)期的中文字符。

問(wèn)題原因

例如 source 執(zhí)行的 SQL文件中的 SQL 語(yǔ)句是

INSERT INTO table_1 (title) VALUES ('好');

SQL文件是UTF8編碼的,MySQL 客戶端向 MySQL 服務(wù)器發(fā)送的 title 字段值的 “好” 的 UTF8編碼字節(jié)序列,十六進(jìn)制表示是 E5A5BD。

mysql-client pod的字符集是 POSIX,MySQL 客戶端向 MySQL 服務(wù)器發(fā)送數(shù)據(jù)采用的就是 latin1編碼,MySQL 服務(wù)器收到數(shù)據(jù)后,使用 latin1 解碼 E5A5BD ,得到字符串 好。

root@mysql-client:/# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
mysql> show variables like 'character_set_%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

由于數(shù)據(jù)表字段的字符集是 UTF8,MySQL 服務(wù)器再將字符串 好 用 UTF8 編碼得到字節(jié)序列 C3A5C2A5C2BD,這個(gè)可以通過(guò)如下 SQL 語(yǔ)句查詢證實(shí)。

select HEX(title) from table_1;

這里說(shuō)一下在驗(yàn)證此過(guò)程時(shí)遇到的問(wèn)題:

剛開(kāi)始使用的中文字符“我”進(jìn)行驗(yàn)證,對(duì)應(yīng)的 UTF8 編碼是 e68891,88 和 91 (位于 80 和 9f 之間)在 latin1 編碼中對(duì)應(yīng)的是控制字符,手動(dòng)解碼后的字符不是正常字符,再使用 UTF8 編碼時(shí)為 C3A6C288C291,和數(shù)據(jù)表中存儲(chǔ)的 C3A6CB86E28098 不一樣(MySQL 代碼中編碼肯定對(duì)控制字符進(jìn)行了正確編碼),為了避免控制字符,想到選用不在 80 和 9f 之間的中文字符“好” E5A5BD ,這樣手動(dòng)編碼后和數(shù)據(jù)表存儲(chǔ)的都是 C3A5C2A5C2BD,這才驗(yàn)證了這個(gè)過(guò)程。

頁(yè)面查詢亂碼的原因:

前端頁(yè)面通過(guò)調(diào)用后臺(tái)接口查詢數(shù)據(jù),后臺(tái)服務(wù)連接 MySQL 使用的字符集是 UTF8,所以character_set_results 就是 UTF8。

MySQL 服務(wù)器從數(shù)據(jù)表中查詢的字節(jié)序列是 C3A5C2A5C2BD,數(shù)據(jù)表字段的編碼也是 UTF8,和 character_set_results 一樣,發(fā)送給后臺(tái)服務(wù)客戶端的字節(jié)序列就是 C3A5C2A5C2BD。

后臺(tái)服務(wù)使用 UTF8 對(duì) C3A5C2A5C2BD 解碼得到 好,所以前端頁(yè)面顯示的就是 好,而不是預(yù)期的中文字符 ”好“。

MySQL 命令行客戶端select 查詢正常的原因:

MySQL 命令行客戶端 session 的 character_set_results 是 latin1 。

MySQL 服務(wù)器從數(shù)據(jù)表中查詢的字節(jié)序列是 C3A5C2A5C2BD,使用 UTF8 解碼后是 好。

再使用 character_set_results 的字符集 latin1 進(jìn)行編碼得到 E5A5BD,將字符序列 E5A5BD 發(fā)送給 MySQL 命令行客戶端。

再發(fā)送給本地的圖形界面的終端模擬器 MobaXterm,MobaXterm 使用的字符集是 UTF8,使用 UTF8 對(duì) E5A5BD 解碼輸出中文字符“好”。

解決方法

連接云上 MySQL 時(shí)指定字符集為 utf8

mysql -hx.x.x.x -uusername -ppassword --default-character-set=utf8

將 MySQL pod 的字符編碼設(shè)置為 UTF8, 這樣 MySQL 客戶端連接服務(wù)器時(shí)使用的字符集就是 utf8

export LANG=C.UTF-8

或者直接在如下命令啟動(dòng)的 MySQL 客戶端中執(zhí)行 source 命令,此命令通過(guò) env LANG=C.UTF-8 設(shè)置了 pod的字符編碼為 UTF8:

kubectl run mysql-client --rm -it --restart='Never' --image mysql:5.7 --command -- env LANG=C.UTF-8 mysql -hx.x.x.x -uusername -ppassword

這樣,MySQL 的 character_set_client、character_set_connection、character_set_results都會(huì)設(shè)置為 utf8, 就和數(shù)據(jù)表字段的字符集保持一致,不會(huì)出現(xiàn)亂碼問(wèn)題。

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

MySQL 客戶端和服務(wù)器通信中的字符集處理

客戶端給服務(wù)器發(fā)送消息過(guò)程

  • 如果 mysql 命令中沒(méi)有指定 --default-character-set 參數(shù),客戶端使用操作系統(tǒng)字符集對(duì)消息編碼發(fā)送給服務(wù)器,否則使用 --default-character-set 參數(shù)的字符集對(duì)消息編碼。
  • 服務(wù)器將 character_set_client、 character_set_connection、character_set_results 設(shè)置為客戶端的字符集。
  • 收到客戶端的消息后,使用 character_set_client 字符集對(duì)消息解碼。
  • 再用 character_set_connection 對(duì)應(yīng)的字符集對(duì)解碼后的消息編碼后處理。

服務(wù)器處理消息時(shí)要轉(zhuǎn)換為 character_set_connection 字符集進(jìn)行處理,比較規(guī)則只有 connection 有,character_set_client 和 character_set_results 都沒(méi)有:

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

服務(wù)器給客戶端發(fā)送消息過(guò)程

  • 服務(wù)器從數(shù)據(jù)表中查詢字段內(nèi)容
  • 將字符內(nèi)容先使用字段的字符集解碼,再使用 character_set_results 字符集編碼后發(fā)給客戶端。
  • 客戶端使用操作系統(tǒng)的字符集解碼消息進(jìn)行展示,這里對(duì)于使用本地圖形界面的終端模擬器登錄遠(yuǎn)程主機(jī)的場(chǎng)景來(lái)說(shuō),消息還會(huì)發(fā)送到本地圖形界面的終端模擬器,使用終端模擬器的字符集對(duì)消息解碼再展示出來(lái)。

到此這篇關(guān)于MySQL insert 記錄后查詢是亂碼問(wèn)題分析的文章就介紹到這了,更多相關(guān)mysql insert 查詢亂碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決myBatis中刪除條件的拼接問(wèn)題

    解決myBatis中刪除條件的拼接問(wèn)題

    這篇文章主要介紹了解決myBatis中刪除條件的拼接問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • mysql如何獲取數(shù)據(jù)列值(int和string)最大值

    mysql如何獲取數(shù)據(jù)列值(int和string)最大值

    最近在開(kāi)發(fā)項(xiàng)目的時(shí)候有個(gè)需求,我數(shù)據(jù)庫(kù)里面存了很多升級(jí)包,升級(jí)包有列數(shù)據(jù)表示的是升級(jí)包的版本號(hào),類型屬于字符串,結(jié)構(gòu)類似于V1.0.2.22這種,然后后臺(tái)有個(gè)任務(wù)需要獲取最新版本號(hào)的那條數(shù)據(jù),本文給大家介紹mysql獲取數(shù)據(jù)列值(int和string)最大值,感興趣的朋友一起看看吧
    2024-01-01
  • MySQ實(shí)現(xiàn)XA事務(wù)的具體使用

    MySQ實(shí)現(xiàn)XA事務(wù)的具體使用

    XA事務(wù)是一種分布式事務(wù)處理協(xié)議,本文主要介紹了MySQ實(shí)現(xiàn)XA事務(wù)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 減少mysql主從數(shù)據(jù)同步延遲問(wèn)題的詳解

    減少mysql主從數(shù)據(jù)同步延遲問(wèn)題的詳解

    本篇文章是對(duì)減少mysql主從數(shù)據(jù)同步延遲的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 優(yōu)化MySQL的慢查詢過(guò)程

    優(yōu)化MySQL的慢查詢過(guò)程

    這篇文章主要介紹了優(yōu)化MySQL的慢查詢過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • phplib中的一些基本語(yǔ)法和函數(shù)

    phplib中的一些基本語(yǔ)法和函數(shù)

    phplib中常用的方法有set_file,set_block,set_var,parse,ppasre,p,get等。
    2010-04-04
  • mysql中窗口函數(shù)lag()用法小結(jié)

    mysql中窗口函數(shù)lag()用法小結(jié)

    LAG()函數(shù)在MySQL中用于訪問(wèn)當(dāng)前行前一行或多行的數(shù)據(jù),它包括偏移量、默認(rèn)值、分區(qū)和排序子句,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • Mysql獲取當(dāng)前日期的前幾天日期的方法

    Mysql獲取當(dāng)前日期的前幾天日期的方法

    這篇文章主要介紹了Mysql獲取當(dāng)前日期的前幾天日期的方法,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-03-03
  • MySQL分布式集群搭建教程

    MySQL分布式集群搭建教程

    這篇文章主要介紹了MySQL分布式集群搭建教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • MySQL 存儲(chǔ)引擎InnoDB 架構(gòu)與原理深度解析

    MySQL 存儲(chǔ)引擎InnoDB 架構(gòu)與原理深度解析

    這篇文章詳細(xì)介紹了MySQL中InnoDB和MyISAM兩種主要存儲(chǔ)引擎的特性、區(qū)別和使用場(chǎng)景,探討了InnoDB的頁(yè)結(jié)構(gòu)、分層存儲(chǔ)結(jié)構(gòu)以及其在事務(wù)管理、崩潰恢復(fù)和并發(fā)控制方面的優(yōu)勢(shì),感興趣的朋友跟隨小編一起看看吧
    2026-03-03

最新評(píng)論

横山县| 方山县| 大城县| 沁阳市| 城市| 辛集市| 温泉县| 松滋市| 兰考县| 蒙山县| 固始县| 巫山县| 台前县| 图们市| 建瓯市| 桐城市| 阿图什市| 盱眙县| 靖江市| 曲沃县| 温泉县| 衡阳县| 武清区| 南充市| 仪征市| 略阳县| 广东省| 广丰县| 吴桥县| 平乐县| 读书| 曲阜市| 北安市| 宜州市| 象山县| 页游| 东丽区| 平安县| 乐昌市| 甘肃省| 古田县|