如何设置MySQL列默认以十六进制格式显示查询结果?
实现MySQL列自动以十六进制格式显示(带0x前缀)
嘿,刚好能帮到你!你想要不用每次手动拼接CONCAT('0x', HEX(c1)),直接SELECT c1就得到带0x前缀的十六进制结果,有两种靠谱的方案,看你的需求选:
方案1:使用虚拟生成列(推荐,MySQL 5.7+支持)
生成列是MySQL自带的特性,可以自动基于其他列计算出结果,而且**虚拟生成列(VIRTUAL)**不会占用额外存储空间,查询时实时计算,非常适合你的场景。
步骤1:创建带生成列的表
我们可以把存储原始数值的列命名为_c1,然后把对外展示的生成列命名为c1,这样直接查询c1就得到格式化后的结果:
CREATE TABLE t1 ( _c1 INT, -- 存储原始整数的列 c1 VARCHAR(20) AS (CONCAT('0x', HEX(_c1))) VIRTUAL -- 自动生成十六进制格式的列 );
如果你的查询频率很高,也可以把VIRTUAL改成STORED——这样生成列会被实际存储在磁盘上,查询速度更快,但会占用少量存储空间,且更新_c1时会自动同步更新c1。
步骤2:插入数据
插入数据时直接操作原始列_c1即可,不管是整数还是十六进制字面量都支持:
INSERT INTO t1 (_c1) VALUES (1), (16); -- 用十六进制字面量插入也完全没问题 INSERT INTO t1 (_c1) VALUES (0x1), (0x10);
步骤3:查询效果
现在直接查询c1就自动得到你想要的格式了:
SELECT c1 FROM t1;
返回结果如下:
c1 ---- 0x1 0x10 0x1 0x10
方案2:使用视图(适合不想修改原表结构的情况)
如果你已经有现成的表,不想改动表结构,可以创建一个视图来封装转换逻辑:
步骤1:创建原始表
CREATE TABLE t1_raw (c1 INT); INSERT INTO t1_raw (c1) VALUES (1), (16), (0x1), (0x10);
步骤2:创建视图
CREATE VIEW t1 AS SELECT CONCAT('0x', HEX(c1)) AS c1 FROM t1_raw;
步骤3:查询视图
直接查询视图t1的c1列,效果和方案1完全一致:
SELECT c1 FROM t1;
注意事项
- 生成列的
VARCHAR长度:int类型的最大值是2^31-1,对应的十六进制是8位,加上0x前缀总共10个字符,所以VARCHAR(20)完全足够;如果是bigint类型,需要调整长度到VARCHAR(20)以上(bigint最大十六进制是16位,加前缀是18位)。 - 生成列是只读的,不能直接插入或更新生成列的值,只能操作对应的原始列。
内容的提问来源于stack exchange,提问作者Harald Nordgren
相关产品推荐
相关产品推荐

