问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

int类型数据在查询时怎么转变为varchar类型

发布网友 发布时间:2022-05-03 03:40

我来回答

2个回答

懂视网 时间:2022-05-05 09:06

最近一周接连处理了2个由于int向varchar转换无法使用索引,从而引发的慢查询。

CREATE TABLE `appstat_day_prototype_201305` (
`day_key` date NOT NULL DEFAULT '1900-01-01',
`appkey` varchar(20) NOT NULL DEFAULT '',
`user_total` bigint(20) NOT NULL DEFAULT '0',
`user_activity` bigint(20) NOT NULL DEFAULT '0',
`times_total` bigint(20) NOT NULL DEFAULT '0',
`times_activity` bigint(20) NOT NULL DEFAULT '0',
`incr_login_daily` bigint(20) NOT NULL DEFAULT '0',
`unbind_total` bigint(20) NOT NULL DEFAULT '0',
`unbind_activitys` bigint(20) NOT NULL DEFAULT '0',
PRIMARY KEY (`appkey`,`day_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
mysql> explain SELECT * from appstat_day_prototype_201305 where appkey = xxxxx and day_key between '2013-05-23' and '2013-05-30';
+----+-------------+------------------------------+------+---------------+------+---------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------------------+------+---------------+------+---------+------+----------+-------------+
| 1 | SIMPLE | appstat_day_prototype_201305 | ALL | PRIMARY | NULL | NULL | NULL | 19285787 | Using where |
+----+-------------+------------------------------+------+---------------+------+---------+------+----------+-------------+
1 row in set (0.00 sec)
mysql> explain SELECT * from appstat_day_prototype_201305 where appkey = 'xxxxx' and day_key between '2013-05-23' and '2013-05-30';
+----+-------------+------------------------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------------------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | appstat_day_prototype_201305 | range | PRIMARY | PRIMARY | 65 | NULL | 1 | Using where |
+----+-------------+------------------------------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)


从上面可以很明显的看到由于appkey是varchar,而在where条件中不加'',会引发全表查询,加了就可以用到索引,这扫描的行数可是天差地别,对于服务器的压力和响应时间自然也是天差地别的。

我们再看另外一个例子:

*************************** 1. row ***************************
Table: poll_joined_151
Create Table: CREATE TABLE `poll_joined_151` (
`poll_id` bigint(11) NOT NULL,
`uid` bigint(11) NOT NULL,
`item_id` varchar(60) NOT NULL,
`add_time` int(11) NOT NULL DEFAULT '0',
`anonymous` tinyint(1) NOT NULL DEFAULT '0',
`sub_item` varchar(1200) NOT NULL DEFAULT '',
KEY `idx_poll_id_uid_add_time` (`poll_id`,`uid`,`add_time`),
KEY `idx_anonymous_id_addtime` (`anonymous`,`poll_id`,`add_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SELECT * FROM poll_joined_151 WHERE poll_id = '2348993' AND anonymous =0 ORDER BY add_time DESC LIMIT 0 , 3
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: poll_joined_151
type: ref
possible_keys: idx_poll_id_uid_add_time,idx_anonymous_id_addtime
key: idx_anonymous_id_addtime
key_len: 9
ref: const,const
rows: 30240
Extra: Using where

从上面的例子看,虽然poll_id的类型为bigint,但是SQL中添加了'',但是这个语句仍然用到了索引,虽然扫描行数也不少,但是能用到索引就是好SQL。

那么一个小小的''为什么会有这么大的影响呢?根本原因是因为MySQL在对文本类型和数字类型进行比较的时候会进行隐式的类型转换。

以下是5.5官方手册的说明:

If both arguments in a comparison operation are strings, they are compared as strings.
两个参数都是字符串,会按照字符串来比较,不做类型转换。
If both arguments are integers, they are compared as integers.
两个参数都是整数,按照整数来比较,不做类型转换。
Hexadecimal values are treated as binary strings if not compared to a number.
十六进制的值和非数字做比较时,会被当做二进制串。
If one of the arguments is a TIMESTAMP or DATETIME column and the other argument is a constant, the constant is converted to a timestamp before the comparison is performed. This is done to be more ODBC-friendly. Note that this is not done for the arguments to IN()! To be safe, always use complete datetime, date, or time strings when doing comparisons. For example, to achieve best results when using BETWEEN with date or time values, use CAST() to explicitly convert the values to the desired data type.
有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp
If one of the arguments is a decimal value, comparison depends on the other argument. The arguments are compared as decimal values if the other argument is a decimal or integer value, or as floating-point values if the other argument is a floating-point value.
有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
In all other cases, the arguments are compared as floating-point (real) numbers.所有其他情况下,两个参数都会被转换为浮点数再进行比较

根据以上的说明,当where条件之后的值的类型和表结构不一致的时候,MySQL会做隐式的类型转换,都将其转换为浮点数在比较。

对于第一种情况:

比如where string = 1;

需要将索引中的字符串转换成浮点数,但是由于'1',' 1','1a'都会比转化成1,故MySQL无法使用索引只能进行全表扫描,故造成了慢查询的产生。

mysql> SELECT CAST(' 1' AS SIGNED)=1;
+-------------------------+
| CAST(' 1' AS SIGNED)=1 |
+-------------------------+
| 1 |
+-------------------------+
1 row in set (0.00 sec)
mysql> SELECT CAST(' 1a' AS SIGNED)=1;
+--------------------------+
| CAST(' 1a' AS SIGNED)=1 |
+--------------------------+
| 1 |
+--------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT CAST('1' AS SIGNED)=1;
+-----------------------+
| CAST('1' AS SIGNED)=1 |
+-----------------------+
| 1 |
+-----------------------+
1 row in set (0.00 sec)


同时需要注意一点,由于都会转换成浮点数进行比较,而浮点数只有53bit,故当超过最大值的时候,比较会出现问题。

对于第二种情况:

由于索引建立在int的基础上,而将纯数字的字符串可以百分百转换成数字,故可以使用到索引,虽然也会进行一定的转换,消耗一定的资源,但是最终仍然使用了索引,不会产生慢查询。

mysql> select CAST( '30' as SIGNED) = 30;
+----------------------------+
| CAST( '30' as SIGNED) = 30 |
+----------------------------+
| 1 |
+----------------------------+
1 row in set (0.00 sec)

热心网友 时间:2022-05-05 06:14

1、varchar是字符串类型,而int是数字整型。varchar类型可以存储任意字符,而int只能存储数字整型所以会报错;
2、你可以将int类型转换为varchar类型,因为varchar可以存储任意的字符;例如:123(一百二十三)位int类型,当你将123转为varchar类型之后就变成了123(一二三)。如果你讲ABC varchar类型转换为ABC int类型时是无法转换的;
...在CASE判断时可不可以将int类型转换为Varchar类型

1,int类型转换varchar类型,不需要强制转换,可隐式转换:SELECT CASE 1 WHEN '1' THEN '可以转换' ELSE '不可以转换' END 2,cast转换方式:SELECT CASE CAST(1 AS VARCHAR(10)) WHEN '1' THEN '用CAST转换成功' ELSE '用CAST转换失败' END 3,convert转换方式:SELECT CASE CONVERT(VARCHAR...

MySQL 时间类型与 INT、VARCHAR 等类型的相互转换

MySQL中,时间数据的存储和转换涉及到多种类型,如INT、VARCHAR和DATETIME。其中,NOW()函数返回当前的日期和时间,其结果可以转化为VARCHAR类型,便于存储和展示。例如:SELECT NOW() AS current_time; -- 输出格式为 'YYYY-MM-DD HH:MM:SS'而CURRENT_TIMESTAMP同样表示当前时间,其输出也为VARCHAR,...

数据库类型转换 varchar int

你的思路是对的,必须保证字段里全部是数字才可以修改 例:表table2中的列id为int型,现改为varchar 型 alter table table2 alter column id varchar 如果要修改整个数据库的类型,可以用下面的语句 例子:把整个数据库的varchar 类型转换为nvarchar(放在查询分析器里执行)declare @sql ...

SQL怎么把同一个表中的字段(int类型)修改为同一个表中另一个字段的(n...

set column1(int) = column2(nvarchar)PS.字段2中的值可以转换成int类型才行,否则更新失败 如果需要排除,则需要一条条的处理,一条条的处理则需要循环,循环的时候用while或者游标

在数据库中怎么让int转换成varchar时前边添上0补位

sql server set number = right(REPLICATE('0',7) + rtrim(id),7)mysql LPAD(id,7,'0')

mysql 把int转换为varchar怎么实现?

int转换为varchar是不能相互转换。拓展:1、MySQL 是一个关系型数据库,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL 是一种关联...

sql 2008 中,将int数据类型如何转换为string?

SQL Server 中的字符串是用char,nchar,varchar,nvarchar等数据类型来实现的。将int数据类型如何转换为字符串可以用如下任意一种方式:declare @num int set @num = 1 -- 方式1:select CONVERT(varchar(10),@num)-- 或者方式2 select CAST(@num as varchar(10))...

...用insert只能插入int类型数据,一旦改为varchar就会给键名报错,然 ...

你这有两个问题 1 字符类型数据要用单引号括起来处理,比如'wang'2 id列是非空列,insert时必须有 insert test(id,add) value(1,'wang')那个括表名,字段名的字符我打不出来,你自己加

mysql 把int转换为varchar怎么实现

alter table 表名 modify 列名 varchar;

Sqlserver的int和varchar类型拼接的问题

1、首先在数据表Table_1中有两列类型为数值的列num1和num2,类型分别为int和float。数据如图所示。2、采用convert或cast函数进行数据类型转换,然后再使用“+”进行字符拼接。转换之后的类型可以是:char、nchar、varchar、nvarchar等。3、convert函数的格式为:convert(varchar(20),num1)其中varchar为可变...

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
老年唱戏机如何使用 云读音是什么 我在京东买了双鞋,但是稍后又取消了订单。当时我让客服取消,他没有取... 在京东买了个东西,发货了,不想要了,然后申请取消了订单,然后快递送到... 在京东买了一块手表,货到付款的,家在村子里,快递员把东西送到我们镇子... 证监局属于什么部门 什么是证券市场的监管 儿童白细胞25算危险吗 负1.20833……三循环变成小数是几分之几 二十分之十九加三分之二等于几分之几? 如何将date类型的数据转换为varchar 如何将文本框字符串转换成varchar格式 转换varchar值溢出怎么办 求高手配置一台lol游戏直播电脑,包括显示屏 teradata varbyte类型怎么转换成varchar类型 英雄联盟直播电脑配置需要多少? mysql里varbinary怎么转成varchar 怎样将Varbinary数据类型的数据转换成varchar型 求解,lol直播需要什么配置 我想做LOL直播都需要什么设备? 我玩英雄联盟,想开直播,要怎样的电脑配置才不卡 开lol直播需要什么配置 37天不批捕一般几点通知家属 拘留37天会给通知吗 如果刑事拘留37天都不放出来,会通知家属吗? 刑事拘留37天后批捕通知家属吗 拘留37天后会通知家属接么 37天拘留多久通知家属 刑事拘留37天后会有通知吗 看守所拘留37天后多久通知家属接人 sql server中 int转varchar的方法 一个一周岁婴儿的记忆力有多久 婴儿的记忆力怎样? 寒假趣事500字以上。谢谢大家 解压出来的文件消失是怎么回事 tp link有线桥接还是无线桥接哪个好 华为t1和x1哪个性价比高 路由器无线桥接好,还是有线连接好 火狐浏览器切换至全球服务是什么意思 华为T1 S8-701u的usb调试在哪啊 华为t1-701u升级问题,为什么无法升级? 怎么查看电脑属性? 电脑都开不了,怎么打开你说的那个“我的电脑属性”了? 有应用比较全面的美容美发软件吗? 可不可以在支付宝查到电费明细? LOGO是一种什么样的文件,制作它要用什么软件? 电费的缴费明细去哪里查,最近宿舍的电费好乱 用什么软件做LOGO比较好 制作logo都是用些什么软件呢。。。 制作网站的LOGO用什么软件?
  • 焦点

最新推荐

猜你喜欢

热门推荐