詳解mysql?bit/json/enum/set?的數(shù)據(jù)存儲
前言
這里主要是 由于之前的一個 datetime 存儲的時間 導(dǎo)致的問題的衍生出來的探究
探究的主要內(nèi)容為 int 類類型的存儲, 浮點(diǎn)類類型的存儲, char 類類型的存儲, blob 類類型的存儲, enum/json/set/bit 類類型的存儲
本文主要 的相關(guān)內(nèi)容是 bit/json/enum/set 類類型的相關(guān)數(shù)據(jù)的存儲
這部分?jǐn)?shù)據(jù) 客戶端 和 服務(wù)器這邊的交互 主要是以字符串的形式交互
服務(wù)器這邊的存儲 相關(guān)的編碼之后的整形, json 為字符串
mysql 中 bit的服務(wù)器客戶端的數(shù)據(jù)交互
測試數(shù)據(jù)表 以及數(shù)據(jù)如下
CREATE TABLE `tz_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `field1` bit(6) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 INSERT INTO `test`.`tz_test`(`id`, `field1`) VALUES (1, '7');
測試腳本如下
package com.hx.test07;
/**
* Test06MysqlTimezone
*
* @author Jerry.X.He
* @version 1.0
* @date 2023/4/24 16:26
*/
public class Test06MysqlTimezone {
// Test06MysqlTimezone
public static void main(String[] args) {
String url = "jdbc:mysql://10.60.50.16:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&autoReconnectForPools=true&useSSL=false";
String username = "root";
String password = "root";
JdbcTemplate jdbcTemplate = Test14GenExpertSql.getMysqlJdbcTemplate(url, username, password);
String sql = " select * from tz_test; ";
List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
int x = 0;
}
}mysql 是將給定的 bit 的數(shù)據(jù)以 字符串的形式 交互給客戶端的
mysql 服務(wù)器中對應(yīng)的類型為 BIT

bit 這邊轉(zhuǎn)換, 是直接獲取的給定的字段對應(yīng)的 字節(jié)序列
這里是 new byte[] { 0x37 }

與客戶端的交互, 取出存放的 bits 的數(shù)據(jù)
然后 拷貝到 val_buffer 響應(yīng)給客戶端, 這里輸出了一個 '7'

mysql 服務(wù)器 bit 的存儲
是轉(zhuǎn)換為單字節(jié)進(jìn)行存儲的

mysql 中 json 的服務(wù)器客戶端的數(shù)據(jù)交互
和上面 bit 相同
mysql 服務(wù)器中對應(yīng)的類型為 JSON

與客戶端的交互, 以 my_charset_bin 反序列化為字符串, 格式化為 json
然后輸出 json 字符串到給定的 buf

mysql 服務(wù)器 json的存儲
將給定的 json 的 字符串以 my_charset_bin 序列化為 二進(jìn)制, 以二進(jìn)制的形式存儲
以下代碼 基于 mysql-8.0.23


mysql 中 enum的服務(wù)器客戶端的數(shù)據(jù)交互
和上面 bit 相同
mysql 服務(wù)器中對應(yīng)的類型為 STRING? 為什么不是 ENUM

與客戶端的交互, 獲取當(dāng)前字段 在枚舉的索引, 然后 根據(jù)配置的選項(xiàng)列表 獲取對應(yīng)的字符串表示

mysql 服務(wù)器 enum 的存儲
根據(jù)輸入的 枚舉字符 獲取索引, 然后 存儲的是具體的索引

假設(shè)輸入的字段值 不在枚舉列表中, 則存放的是 0, 表示的空字符串

數(shù)據(jù)的存儲是根據(jù)索引的值域 按不同的長度進(jìn)行存儲

mysql 中 set 的服務(wù)器客戶端的數(shù)據(jù)交互
和上面 bit 相同
mysql 服務(wù)器中對應(yīng)的類型為 STRING? 為什么不是 SET

與客戶端的交互, 從當(dāng)前字段的值中 按照權(quán)重 獲取相應(yīng)的字符串表示, 并用 分隔符 連接起來

mysql 服務(wù)器 set 的存儲
可以看到 boy, girl, unknown 的索引分別為 0, 1, 2, 權(quán)重分別為 1, 2, 4
因此 這里存儲的 girl, unknown 為 2 + 4 = 6
數(shù)據(jù)的存儲 和上面 enum 一致, 根據(jù)存儲的值的取值區(qū)間 按不同的長度進(jìn)行存儲

對于匹配不上的值 這里的處理是 直接過濾掉

到此這篇關(guān)于mysql bit/json/enum/set 的數(shù)據(jù)存儲的文章就介紹到這了,更多相關(guān)mysql 數(shù)據(jù)存儲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解使用navicat連接遠(yuǎn)程linux mysql數(shù)據(jù)庫出現(xiàn)10061未知故障
這篇文章主要介紹了navicat連接遠(yuǎn)程linux mysql數(shù)據(jù)庫出現(xiàn)10061未知故障,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
MYSQL關(guān)聯(lián)關(guān)系查詢方式
文章詳細(xì)介紹了MySQL中如何使用內(nèi)連接和左外連接進(jìn)行表的關(guān)聯(lián)查詢,并展示了如何選擇列和使用別名,文章還提供了一些關(guān)于查詢優(yōu)化的建議,并鼓勵讀者參考和支持腳本之家2025-02-02
解決Linux下Tomcat向MySQL插入數(shù)據(jù)中文亂碼問題
本文給大家介紹的是如何解決win平臺下開發(fā)的項(xiàng)目移植到Linux平臺后,向MySQL插入數(shù)據(jù)時中文出現(xiàn)亂碼的問題,非常的簡單實(shí)用,有需要的小伙伴可以參考下2018-04-04
MySQL學(xué)習(xí)之日期函數(shù)的用法詳解
本文將學(xué)習(xí)MySQL的日期函數(shù),在前面章節(jié)的練習(xí)中,我們就利用過NOW()函數(shù)來獲取過當(dāng)前系統(tǒng)時間,用DATEDIFF函數(shù)來計(jì)算日期相差的天數(shù),接下來我們就系統(tǒng)的學(xué)習(xí)一下 日期函數(shù)2022-08-08
MySQL?遷移OB?Oracle場景中自增主鍵實(shí)踐操作
這篇文章主要介紹了MySQL?遷移OB?Oracle場景中自增主鍵實(shí)踐操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
MySQL ERROR 1045 (28000): Access denied for user ''root''@''
這篇文章主要介紹了MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 的原因分解決辦法的相關(guān)資料,需要的朋友可以參考下2016-05-05

