精华内容
下载资源
问答
  • --使用CAST将varchar转换成int类型排序 select distinct(zone_id) from guild_rank_info order by CAST(zone_id as SIGNED); --使用CONVERT将varchar转换成int类型排序 select distinct(zone_id) from guild_...





    转载于:https://www.cnblogs.com/edgedance/p/7028072.html

    展开全文
  • MySql中的varchar转换成int类型排序

    千次阅读 2017-09-07 10:16:00
    MySql中的varchar转换成int类型排序 1、select server_id from cardserver where game_id = 1 order by server_id+0 desc limit 10; 2、mysql为我们提供了两个类型转换函数:CAST和CONVERT,现成的东西...

    MySql中的varchar转换成int类型排序

    1、select server_id from cardserver where game_id = 1 order by server_id+0 desc limit 10;


    2、mysql为我们提供了两个类型转换函数:CAST和CONVERT,现成的东西我们怎能放过?

    CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另一个类型的值。

    这个类型 可以是以下值其中的 一个:
    BINARY[(N)]
    CHAR[(N)]
    DATE
    DATETIME
    DECIMAL
    SIGNED [INTEGER]
    TIME
    UNSIGNED [INTEGER]

    所以我们也可以用CAST解决问题:

    select server_id from cardserver where game_id = 1 order by CAST(server_id as SIGNED) desc limit 10

    3、也可以使用CONVERT来搞定此问题:
    select server_id from cardserver where game_id = 1 order by CONVERT(server_id,SIGNED) desc limit 10

    展开全文
  • 整数长度 int(n) 与 zerofillint(n) 只影响显示字符的宽度,不限制数值的合法范围。int(3) 依然可以存储 123456789 这么大的数值。若设置了 zerofill 属性,当 int(3) 存储 12 时,会在前面补0,补足3位。即 012;当...

    5379a9c8576ab4bcc989286a5da022a7.png

    〇、MySQL数据类型

    1. 数值数据类型

    数值数据类型存储数值。
    MySQL支持多种数值数据类型,每种存储的数值具有不同的取值范围。

    整数

    fce6f207c47c52833191b76d100e5786.png
    • 长度 int(n)zerofill

    int(n) 只影响显示字符的宽度,不限制数值的合法范围。int(3) 依然可以存储 123456789 这么大的数值。
    若设置了 zerofill 属性,当 int(3) 存储 12 时,会在前面补0,补足3位。即 012;当 int(5) 存储 12 时,会在前面补三个0,补足5位。即 00012

    • 有符号或无符号

    所有数值数据类型(除 BITBOOLEAN 外)都可以有符号或无符号。有符号数值列可以存储正或负的数值,无符号数值列只能存储正数。默认情况为有符号,但如果你知道自己不需要存储负值,可以使用 UNSIGNED 关键字,这样做将允许你存储两倍大小的值。

    小数

    8916722cacce8bf1c027191154b3853c.png
    DECIMAL最常用的用法就是用来存储货币,例如 DECIMAL(8, 2)
    DECIMAL还可以用于存储比BIGINT还大的整数以及精确的小数。

    2. 串数据类型

    885ffc537367d59c9e043563b1b53eb3.png
    从 MySQL4.1 版本开始,char(n)varchar(n) 中的 n 指字符长度,不再表示之前版本的字节长度。也就是说在不同字符集下,char类型列的内部存储可能不是定长数据。

    CHAR

    CHAR 是定长字符串,会直接根据定义字符串时指定的长度分配足够的空间。
    CHAR 适合存储所有值长度相同的字符串或很短的字符串。

    VARCHAR

    VARCHAR 的最大长度是65535个字节,而 varchar(n) 中的 n 指字符长度,因此,n 的最大值是由当前字段的字符集决定的。当字符集是 utf8 时,n 的最大值为 21845。当字符集是 utf8mb4 时,n 的最大值为 16383。(但是实际上MySQL要求一个行的定义长度不能超过65535个字节,因此,除非表中只有这一个字段,否则 n 的值达不到上述的最大值)。

    VARCHAR 使用1-2个额外字节记录字符串长度,列长度小于等于255个字符时,使用1个字节记录,否则使用2个字节。

    最佳实践

    • 对于经常变更的数据, CHAR 比 VARCHAR 更好,CHAR 的磁盘空间利用率更高,不容易产生碎片。
    • 当列中数据的长度相同时,选择 CHAR;当列中数据长度参差不齐时,选择 VARCHAR。
    • 对于非常短的列,CHAR 比 VARCHAR 在存储上更有效率。
    • 只分配真正需要的空间,更长的列会消耗更多的内存。
    • 尽量避免使用 BLOB/TEXT 类型,查询时会使用临时表,导致严重的性能开销。如果一定要用,建议单独建表存储该字段。

    3. 二进制数据类型

    3b1345be4d31ff8711e18a6cfd19177e.png

    4. 日期和时间类型

    b5064cb3c9887885e1ab5a026e814b2d.png

    最佳实践

    • 尽量使用 TIMESTAMP,比 DATETIME 的空间利用率高。

    一、创建数据表

    CREATE TABLE

    使用CREATE TABLE 创建表,必须给出下列信息:

    • 表的名字,在关键字 CREATE TABLE 之后给出;
    • 表中字段的名字和定义,用逗号分隔。

    以下为创建MySQL数据表的SQL通用语法:

    CREATE TABLE table_name (
        column1 datatype [NULL|NOT NULL] [DEFAULT ],
        column2 datatype,
    );

    实例

    • 创建用户表
    CREATE TABLE IF NOT EXISTS `user` (
        `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
          `username` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
          `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
          `password` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '密码',
          `status` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '状态',
          `created_at` int(11) unsigned NOT NULL,
        PRIMARY KEY (`id`) USING BTREE,
          UNIQUE KEY `unq_email` (`email`) USING BTREE,
         KEY `idx_username` (`username`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT '用户表';

    实例解析

    如果数据库中不存在 user 表时,创建该表。存储引擎为 InnoDB,默认字符集为utf8
    ENGINE 设置存储引擎,CHARSET 设置编码。

    CREATE TABLE IF NOT EXISTS `user` (
    ...
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT '用户表'

    创建名为 id 的字段,整型,非负数,不能为空,自增。

    如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
    AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。

    `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT

    创建名为 username 的字段,字符串类型,最大长度为190个字符,字符集为 utf8mb4,不能为空

    `username` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,

    将字段 id 设为主键,使用 BTREE 索引

    PRIMARY KEY关键字用于定义列为主键。 可以使用多列来定义主键,列间以逗号分隔。

    PRIMARY KEY (`id`) USING BTREE,

    为字段 email 添加唯一索引,索引名称为 unq_email
    设置了唯一索引的字段不能出现重复的值,但是如果字段可以为 null,则允许出现多个 null 值。

    UNIQUE KEY `unq_email` (`email`) USING BTREE

    为字段 username 添加普通索引,索引名称为 idx_username

    KEY `idx_username` (`username`)

    二、查看数据表

    1. 查看数据库中的所有数据表

    SHOW TABLES 用于查看数据库中的所有数据表。

    mysql> SHOW TABLES;
    +----------------+
    | Tables_in_test |
    +----------------+
    | user           |
    +----------------+
    1 row in set (0.07 sec)

    2. 查看数据表的建表SQL语句

    SHOW CREATE TABLE 用于查看指定数据表的建表SQL语句

    语法:

    SHOW CREATE TABLE table_name
    • 查看 user 表的建表语句
    mysql> SHOW CREATE TABLE `user`G
    *************************** 1. row ***************************
           Table: user
    Create Table: CREATE TABLE `user` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `username` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
      `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      `password` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '密码',
      `status` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '状态',
      `created_at` int(11) unsigned NOT NULL,
      PRIMARY KEY (`id`) USING BTREE,
      UNIQUE KEY `unq_email` (`email`) USING BTREE,
      KEY `idx_username` (`username`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用户表'
    1 row in set (0.00 sec)
    

    3. 查看数据表结构

    DESCRIBE 和 DESC

    DESCRIBE 可用于查看表结构,DESCDESCRIBE 的缩写。

    语法:

    DESCRIBE table_name
    • 查看 user 表的表结构
    mysql> DESCRIBE `user`;
    +------------+---------------------+------+-----+---------+----------------+
    | Field      | Type                | Null | Key | Default | Extra          |
    +------------+---------------------+------+-----+---------+----------------+
    | id         | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
    | username   | varchar(190)        | NO   | MUL | NULL    |                |
    | email      | varchar(255)        | YES  | UNI | NULL    |                |
    | password   | varchar(255)        | YES  |     | NULL    |                |
    | status     | tinyint(3) unsigned | NO   |     | 0       |                |
    | created_at | int(11) unsigned    | NO   |     | NULL    |                |
    +------------+---------------------+------+-----+---------+----------------+
    6 rows in set (0.00 sec)
    mysql> DESC `user`;
    +------------+---------------------+------+-----+---------+----------------+
    | Field      | Type                | Null | Key | Default | Extra          |
    +------------+---------------------+------+-----+---------+----------------+
    | id         | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
    | username   | varchar(190)        | NO   | MUL | NULL    |                |
    | email      | varchar(255)        | YES  | UNI | NULL    |                |
    | password   | varchar(255)        | YES  |     | NULL    |                |
    | status     | tinyint(3) unsigned | NO   |     | 0       |                |
    | created_at | int(11) unsigned    | NO   |     | NULL    |                |
    +------------+---------------------+------+-----+---------+----------------+
    6 rows in set (0.00 sec)

    EXPLAIN

    EXPLAIN 也可以用于查看表结构。

    语法:

    EXPLAIN table_name

    DESCRIBEEXPLAIN 语句是同义词,实际上在平时使用过程中 DESCRIBE 多用于获取表结构的信息,而 EXPLAIN 多用于获取SQL语句的执行计划。

    • 查看 user 表的表结构
    mysql> EXPLAIN `user`;
    +------------+---------------------+------+-----+---------+----------------+
    | Field      | Type                | Null | Key | Default | Extra          |
    +------------+---------------------+------+-----+---------+----------------+
    | id         | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
    | username   | varchar(190)        | NO   | MUL | NULL    |                |
    | email      | varchar(255)        | YES  | UNI | NULL    |                |
    | password   | varchar(255)        | YES  |     | NULL    |                |
    | status     | tinyint(3) unsigned | NO   |     | 0       |                |
    | created_at | int(11) unsigned    | NO   |     | NULL    |                |
    +------------+---------------------+------+-----+---------+----------------+
    6 rows in set (0.03 sec)

    三、修改数据表

    1. 重命名数据表

    • 语法
    RENAME TABLE old_name TO new_name;
    • user 表重命名为 consumer ,再改回 user
    mysql> RENAME TABLE `user` TO `consumer`;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SHOW TABLES;
    +----------------+
    | Tables_in_test |
    +----------------+
    | consumer       |
    +----------------+
    1 row in set (0.06 sec)
    
    mysql> RENAME TABLE `consumer` TO `user`;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SHOW TABLES;
    +----------------+
    | Tables_in_test |
    +----------------+
    | user           |
    +----------------+
    1 row in set (0.05 sec)

    2. 增加字段

    • 语法
    ALTER TABLE table_name ADD column_name column_type
    • user 表添加一个字段 intro
    mysql> ALTER TABLE `user` ADD `intro` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '简介' AFTER `email`;
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> DESC `user`;
    +------------+---------------------+------+-----+---------+----------------+
    | Field      | Type                | Null | Key | Default | Extra          |
    +------------+---------------------+------+-----+---------+----------------+
    | id         | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
    | username   | varchar(190)        | NO   | MUL | NULL    |                |
    | email      | varchar(255)        | YES  | UNI | NULL    |                |
    | intro      | varchar(255)        | YES  |     | NULL    |                |
    | password   | varchar(255)        | YES  |     | NULL    |                |
    | status     | tinyint(3) unsigned | NO   |     | 0       |                |
    | created_at | int(11) unsigned    | NO   |     | NULL    |                |
    +------------+---------------------+------+-----+---------+----------------+
    7 rows in set (0.06 sec)

    3. 修改字段

    修改字段名和属性

    • 语法
    ALTER TABLE table_name CHANGE old_name new_name column_type;
    • user 表的 intro 字段名改为 about
    mysql> ALTER TABLE `user` CHANGE `intro` `about` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '简介';
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> DESC `user`;
    +------------+---------------------+------+-----+---------+----------------+
    | Field      | Type                | Null | Key | Default | Extra          |
    +------------+---------------------+------+-----+---------+----------------+
    | id         | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
    | username   | varchar(190)        | NO   | MUL | NULL    |                |
    | email      | varchar(255)        | YES  | UNI | NULL    |                |
    | about      | varchar(255)        | YES  |     | NULL    |                |
    | password   | varchar(255)        | YES  |     | NULL    |                |
    | status     | tinyint(3) unsigned | NO   |     | 0       |                |
    | created_at | int(11) unsigned    | NO   |     | NULL    |                |
    +------------+---------------------+------+-----+---------+----------------+
    7 rows in set (0.07 sec)

    修改字段属性

    • 语法
    ALTER TABLE table_name MODIFY column_name column_type;
    • user 表的 about 字段字符串最大长度改为200个字符
    mysql> ALTER TABLE `user` MODIFY `about` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '简介';
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> DESC `user`;
    +------------+---------------------+------+-----+---------+----------------+
    | Field      | Type                | Null | Key | Default | Extra          |
    +------------+---------------------+------+-----+---------+----------------+
    | id         | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
    | username   | varchar(190)        | NO   | MUL | NULL    |                |
    | email      | varchar(255)        | YES  | UNI | NULL    |                |
    | about      | varchar(200)        | YES  |     | NULL    |                |
    | password   | varchar(255)        | YES  |     | NULL    |                |
    | status     | tinyint(3) unsigned | NO   |     | 0       |                |
    | created_at | int(11) unsigned    | NO   |     | NULL    |                |
    +------------+---------------------+------+-----+---------+----------------+
    7 rows in set (0.09 sec)

    4. 删除字段

    • 语法
    ALTER TABLE table_name DROP COLUMN column_name;
    • user 表中删除 about 字段
    mysql> ALTER TABLE `user` DROP COLUMN `about`;
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> DESC `user`;
    +------------+---------------------+------+-----+---------+----------------+
    | Field      | Type                | Null | Key | Default | Extra          |
    +------------+---------------------+------+-----+---------+----------------+
    | id         | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
    | username   | varchar(190)        | NO   | MUL | NULL    |                |
    | email      | varchar(255)        | YES  | UNI | NULL    |                |
    | password   | varchar(255)        | YES  |     | NULL    |                |
    | status     | tinyint(3) unsigned | NO   |     | 0       |                |
    | created_at | int(11) unsigned    | NO   |     | NULL    |                |
    +------------+---------------------+------+-----+---------+----------------+
    6 rows in set (0.08 sec)

    5. 添加索引

    • 语法
    ALTER TABLE `user` ADD [ KEY | UNIQUE KEY | PRIMARY KEY] idx_name (column_name);
    • user 表中的 created_at 字段添加普通索引,索引名为 idx_created_at
    mysql> ALTER TABLE `user` ADD KEY `idx_created_at` (`created_at`);
    Query OK, 0 rows affected (0.02 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> DESC `user`;
    +------------+---------------------+------+-----+---------+----------------+
    | Field      | Type                | Null | Key | Default | Extra          |
    +------------+---------------------+------+-----+---------+----------------+
    | id         | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
    | username   | varchar(190)        | NO   | MUL | NULL    |                |
    | email      | varchar(255)        | YES  | UNI | NULL    |                |
    | password   | varchar(255)        | YES  |     | NULL    |                |
    | status     | tinyint(3) unsigned | NO   |     | 0       |                |
    | created_at | int(11) unsigned    | NO   | MUL | NULL    |                |
    +------------+---------------------+------+-----+---------+----------------+
    6 rows in set (0.07 sec)

    6. 删除索引

    • 语法
    ALTER TABLE `user` DROP KEY idx_name;
    • 删除 user 表中的 created_atemail 两个字段的索引,索引名为 idx_created_atunq_email
    mysql> ALTER TABLE `user` DROP KEY `idx_created_at`;
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> ALTER TABLE `user` DROP KEY `unq_email`;
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> DESC `user`;
    +------------+---------------------+------+-----+---------+----------------+
    | Field      | Type                | Null | Key | Default | Extra          |
    +------------+---------------------+------+-----+---------+----------------+
    | id         | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
    | username   | varchar(190)        | NO   | MUL | NULL    |                |
    | email      | varchar(255)        | YES  |     | NULL    |                |
    | password   | varchar(255)        | YES  |     | NULL    |                |
    | status     | tinyint(3) unsigned | NO   |     | 0       |                |
    | created_at | int(11) unsigned    | NO   |     | NULL    |                |
    +------------+---------------------+------+-----+---------+----------------+
    6 rows in set (0.06 sec)
    

    四、删除数据表

    可以使用 DROP TABLE 命令删除一个或者多个数据表。

    在使用 DROP TABLE 删除数据表时,要删除的数据表必须存在,否则会报错。

    1. 删除一个数据表

    DROP TABLE tablename

    2. 批量删除数据表

    DROP TABLE tablename1,tablename2,tablename3
    • 删除 user
    mysql> DROP TABLE `user`;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> DESC `user`;
    1146 - Table 'test.user' doesn't exist
    
    mysql> SHOW TABLES;
    Empty set

    欢迎关注【全栈札记】

    展开全文
  • // 输出:2我们来看看运算过程: 10 1010 —————— 00100010 转换成十进制就是 2。一定要记得是向左对齐。或者称为低位顺位对齐模式。如果你不会十进制转二进制或二进制转十进制不会。那么,下面这两个方法能...
    c4d183de17c8330eb64f4ae5d9c23240.png位运算想必软件相关专业的同学应该非常清楚。非科班专业出身的也不要着急。今天博主就带着大家一起来回顾一下这些基础知识,同时也会讲位运算在 PHP 实际项目当中的高级运用技巧。

    一、位运算知识回顾

    在大学的时候,我们会有一门课程《计算机组成原理》。当然,每所高校的课程名称不尽相同。这个咱们先别计较。PHP 手册当中,专门对位运算及位运算符进行了使用介绍。https://www.php.net/manual/zh/language.operators.bitwise.php

    1) 按位与运算符:&

    之所以称为位运算,指的是在运算过程中,我们会把两组需要位运算的数值进行二进制化,然后两组二进制的数字从低位向左对齐。这里的位指的是二进制数字的位置。而按位与运算符指的是两组数值每一位相与,同为 1 则 结果为 1,否则为 0。看 PHP 示例:
    echo 1 & 3; // 输出:1
    为什么会输出 1 呢?那是因为:1 的二进制表示结果为:01。3 的二进制表示结果为:11。那么这两组二进制结果对齐之后的运算流程如下:
    01
    11
    ——
    01
    从右往左进行位运算,都 为 1 则结果为1,否则为 0。结果自然是 01。而 01 转换成十进制就是 1 。所以,输出的结果为 1。再看一组示例吧:
    echo 2 & 10; // 输出:2
    我们来看看运算过程:
    10
    1010
    ——————
    0010
    0010 转换成十进制就是 2。一定要记得是向左对齐。或者称为低位顺位对齐模式。如果你不会十进制转二进制或二进制转十进制不会。那么,下面这两个方法能帮助你。
    echo decbin(10); // 十进制转二进制。
    echo bindec(10); // 二进制转十进制。

    2) 按位或运算符:|

    这个跟上面的按位与运算符稍微有一点不同:只要两组数字当中有只要有一位是 1 则结果就为 1。看示例:
    echo 2 | 10; // 输出结果:10
    运算过程:
    10
    1010
    ——————
    1010
    1010 的十进制结果就是 10。

    3) 按位异或运算符:^

    这个运算符比较有意思:两组数字必须是一组 0 与 1 结果才为 1。1 与 1 和 0 与1 都是 0。看示例:
    echo 1 ^ 1; // 输出结果:0
    echo 1 ^ 0; // 输出结果:1
    1 ^ 1 运算过程:
    01
    01
    ——
    00
    1 ^ 0 运算过程:
    01
    00
    ——
    01
    这个很简单。没啥好说的。反正不相同就为 1,相同就为 0。

    4) 其他位运算符:~、>>、<<

    ~ 按位取反运算符、>> 右移运算符、<< 左移运算符。它们的操作数都是一个。所以,与上面的两个操作数的位运算符有着非常明显的区别。在 PHP 实际编程当中,运用比较少。权当知识了解即可。

    二、高级动用技巧

    我们在上面对位运算符的知识进行了回顾。为的就是要在接下来的实际项目中怎样运用它解决实际问题。我们首先来看一个系统中常见的需求:有一个广告表,我们要对广告做显示控制:
    • 手动上下线。

    • 只允许 VIP 查看。

    可能的表结构如下:
    CREATE TABLE `finger_ad` (
    `ad_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
    `ad_name` varchar(50) NOT NULL COMMENT '广告名称',
    `ad_image_url` varchar(255) NOT NULL COMMENT '广告图片',
    `ad_url` varchar(255) NOT NULL COMMENT '广告图片URL跳转地址',
    `is_vip` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否仅限 VIP 显示',
    `display` tinyint(1) NOT NULL DEFAULT '1' COMMENT '显示状态:1显示、0隐藏',
    PRIMARY KEY (`ad_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='广告表';
    假如后期,我们需求更改了。需要再增加几种限制:
    • 已登录用户

    • 未登录用户

    • 30 天内未登录用户

    • 注册 30 天的用户

    遇到这种限制条件的需求,开发同学是不是很伤脑筋?可能很多开发第一反应就是在表结构增加这种新增的限制条件字段。一切看来似乎很美好。的确,这样添加字段是最快最容易的方式。也能完成我们的需求。但是,这样会引来如下毛病:
    • 每次增加限制条件。我们都要增加字段。这种对数据库的更动能少改就少改。毕竟,无限制的增加字段不可取。

    • 假如广告表数据量很大。大到增加一个字段需要几分钟的时候,这会给数据库服务器造成读写压力。

    • 条件越多,SQL 条件语句就会越来越长。

    那么,还有没有更好的方式解决这些问题呢?答案:有!这就是我们今天要讲的按位与运算符的高级技巧。我们把上面的表结构改一下:
    DROP TABLE IF EXISTS `finger_ad`;
    CREATE TABLE `finger_ad` (
    `ad_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
    `ad_name` varchar(50) NOT NULL COMMENT '广告名称',
    `ad_image_url` varchar(255) NOT NULL COMMENT '广告图片',
    `ad_url` varchar(255) NOT NULL COMMENT '广告图片URL跳转地址',
    `bit_condition` INT(11) UNSIGNED NOT NULL COMMENT '位运算条件:1-登录可访问、2-未登录可访问、4-30天注册可访问、8-30天未登录可访问、16-未消费可访问、32-VIP可访问',
    `display` tinyint(1) NOT NULL DEFAULT '1' COMMENT '显示状态:1显示、0隐藏',
    PRIMARY KEY (`ad_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET UTF8 COMMENT='广告表';
    我们把所有的条件都去掉了。增加了一个字段: bit_condition 。把所有的条件都组合到一个字段。那我们此时该如何写代码呢?比如,现在要添加如下限制条件的广告:只允许登录用户访问或已注册 30 天用户或是 VIP 用户才允许访问该广告。那么,这个广告的 bit_condition 该如何设置值呢?很简单,把这几个条件的位值直接相加。此时值为:37。很多可能会很奇怪。设置为 37 ,我怎么知道是这几个值的和呢?如果对 Linux 系统权限熟悉的同学就很容易理解这种做法。实际上,这里运用了按位与运算的特性:任意组合相加的值不会重复。这个理解起来有一定难度。我三两句也很难给你梳理明白。大家可以在网上深入挖掘一下这方面儿的知识。你只需要知道这一点特点即可。那么,现在我们该如何写 SQL 呢?示例如下:
    SELECT * FROM finger_ad WHERE display = 1 AND bit_condition & 3 = bit_condition
    这条 SQL 语句当中的 3 对应的是当前用户针对这么多条件得到的数值。如果 bit_condition位值是与 3 按位与与 bit_condition 结果相同,说明条件符合。我们通过一个字段解决了所有条件的问题。着实得感谢按位与运算符的特性。同时也对 MySQL能支持位运算符感到开心。那么,它有什么缺点呢?想必有经验的同学已经看出来了。这种写法只能满足包含关系。假如要实现同时满足 3 个条件才能访问就不行了。或者,一个满足另外一个取反。优点明显,同样缺点也很明显。大家要根据实际情况来选用。fb1119b94eed6454da9c323fe37b1794.png
    展开全文
  • varchar转换int

    2016-05-24 14:32:12
    问题描述:  需要对某个字段进行排序,不过该字段是字符串,如char或varchar类型,从而会造成排序不准确 解决方法: ... 是用to_number(字段)转换成数字格式,前提是字段的内容都是数字,不包含字母
  • // sql语句 中把varchar类型转换成int select * from tableName order by cast(result as SIGNED INTEGER) asc; 转载于:https://www.cnblogs.com/yeanet/p/8418155.html
  • 1 BINARY[(N)] 2 CHAR[(N)] 3 DATE 4 DATETIME 5 DECIMAL 6 SIGNED [INTEGER] ...--使用CAST将varchar转换成int类型排序 select server_id from cardserver where game_id = 1 order by CAST(serv...
  • Mysql中的varchar类型转换成int类型

    千次阅读 2018-11-01 11:33:08
    Mysql中的varchar类型转换成int类型 1.实战案例 1.1 student表结构 mysql&gt; desc student; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--...
  • 查询SQL中将varchar类型转换成int使用场景CAST和CONVERT举例说明 使用场景 多表联查,同一个字段的类型不同时,需要将类型进行转换之后使用。 CAST和CONVERT mysql为我们提供了两个类型转换函数:CAST和CONVERT 1 ...
  • select * from ff_pipeline a ...字符集转换 : CONVERT(xxx USING gb2312) 类型转换和SQL Server一样,就是类型参数有点点不同 : CAST(xxx AS 类型) , CONVERT(xxx,类型),类型必须用下列的类型: 可用的类型:  ...
  • 最近一周接连处理了2个由于intvarchar转换无法使用索引,从而引发的慢查询。CREATE TABLE`appstat_day_prototype_201305` (`day_key` dateNOT NULL DEFAULT '1900-01-01',`appkey`varchar(20) NOT NULL DEFAULT ''...
  • 正在做一个通用分页的存储过程,但是遗憾的是没有总页输出,现在就是通过各种...在将 varchar 值 'Select COUNT(0) From Noteing Where UserId = 1 And ClassifId = 1' 转换成数据类型 int 时失败。 分不多,还请海涵
  • mysql中,怎么把varchar类型的字段转换成int类型的?(ps:是要把excel中的数据导到数据库的表中,可是excel中的那个字段内容是中文的,而数据库表里的那个字段内容是数字的,所以需要转换一下类型)
  • 展开全部这样:select to_number('123') from dualoracle没有显示的INT型,你直接定义number就好,强制类型转换函数都差不多,转换为e69da5e6ba903231313335323631343130323136353331333431373330日期型就是TO_...
  • 1,问题 2,需求 我想将 adb 数据库的表 tableA 复制...name(varchar) 字段的数据对应到了 age(int) 字段中,自然就报错了, 可能这是navicat工具自身的一个问题吧! 4,解决 4.1,使用工具的数据传输, 4.2,选
  • select * from gyzd_yysinfo order by cast(yysid as SIGNED INTEGER) 或者 select * from gyzd_yysinfo order by cast(yysid as UNSIGNED INTEGER)
  • 日常数据分析过程中,经常会遇到排序的情况,有时会根据空字段表进行临时排序,转换数据类型 使用ORDER BY CAST (<字段名> AS INT) ASC 举例: SELECT IBM,CMC FROM YXHIS..TBZDBQ ORDER BY CAST (CWBM AS ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 462
精华内容 184
关键字:

varchar转换成int