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

MySQL insert 記錄后查詢亂碼問題解決方法

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

問題現(xiàn)象

后臺應(yīng)用程序使用的是云上的 MySQL 服務(wù),需要給 MySQL 數(shù)據(jù)表里 insert 一些數(shù)據(jù),平時都是先運(yùn)行一個 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ù)時發(fā)現(xiàn)環(huán)境上已經(jīng)有運(yùn)行的 MySQL pod了,就將 SQL 文件復(fù)制到已運(yùn)行的 MySQL pod中,然后通過命令進(jìn)入到MySQL pod里,再連接到云上 MySQL:

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

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

問題原因

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

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,這個可以通過如下 SQL 語句查詢證實(shí)。

select HEX(title) from table_1;

這里說一下在驗(yàn)證此過程時遇到的問題:

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

頁面查詢亂碼的原因:

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

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

后臺服務(wù)使用 UTF8 對 C3A5C2A5C2BD 解碼得到 好,所以前端頁面顯示的就是 好,而不是預(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 對 E5A5BD 解碼輸出中文字符“好”。

解決方法

連接云上 MySQL 時指定字符集為 utf8

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

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

export LANG=C.UTF-8

或者直接在如下命令啟動的 MySQL 客戶端中執(zhí)行 source 命令,此命令通過 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都會設(shè)置為 utf8, 就和數(shù)據(jù)表字段的字符集保持一致,不會出現(xià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ā)送消息過程

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

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

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ā)送消息過程

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

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

相關(guān)文章

  • 解決myBatis中刪除條件的拼接問題

    解決myBatis中刪除條件的拼接問題

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

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

    最近在開發(fā)項(xiàng)目的時候有個需求,我數(shù)據(jù)庫里面存了很多升級包,升級包有列數(shù)據(jù)表示的是升級包的版本號,類型屬于字符串,結(jié)構(gòu)類似于V1.0.2.22這種,然后后臺有個任務(wù)需要獲取最新版本號的那條數(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ù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 減少mysql主從數(shù)據(jù)同步延遲問題的詳解

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

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

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

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

    phplib中的一些基本語法和函數(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中用于訪問當(dāng)前行前一行或多行的數(shù)據(jù),它包括偏移量、默認(rèn)值、分區(qū)和排序子句,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(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分布式集群搭建教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • MySQL 存儲引擎InnoDB 架構(gòu)與原理深度解析

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

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

最新評論

汪清县| 安阳县| 泰州市| 同德县| 拉孜县| 五家渠市| 新泰市| 梧州市| 凤冈县| 蒲城县| 葵青区| 和政县| 兴义市| 安顺市| 扶沟县| 望江县| 库伦旗| 绩溪县| 河西区| 东乡| 长顺县| 桂平市| 肥东县| 河北省| 天柱县| 民权县| 巨鹿县| 嘉峪关市| 丹巴县| 龙游县| 庆城县| 濮阳县| 乐东| 台山市| 大城县| 富宁县| 方正县| 威信县| 左云县| 夏邑县| 曲水县|