精华内容
下载资源
问答
  • 比如:Oracle数据库采用utf-8编码,此时你定义一个字符型字段的长度是10,那么这个10不是表示字符的个数。可能有会认为他也能存10个汉字,这个的话就错了。实际上它只能存储3汉字,因为当数据库采用utf-8编码时,在...

     我们在在定义数据的时候,当定义的字段是字符型时,而这个字段要存储汉字时,要特别注意。此时字符的长度应该与数据库采用的编码结合起来。

     

    比如:Oracle数据库采用utf-8编码,此时你定义一个字符型字段的长度是10,那么这个10不是表示字符的个数。可能有会认为他也能存10个汉字,这个的话就错了。实际上它只能存储3汉字,因为当数据库采用utf-8编码时,在数据库中,一个汉字是用3个字节才存储。所以,在utf-8编码下,要想存储10个汉字,那你至少要把这个字段的长度定义成30。比如定义成varchar2(30) 。

    转载于:https://www.cnblogs.com/hibernate3-example/archive/2009/03/23/2492590.html

    展开全文
  • 文章目录一、redis的简介二、redis的使用1.redis的安装和主从复制的部署2.redis的...和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和h...

    一、redis的简介

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

    二、redis的使用

    1.redis的安装和主从复制的部署

    环境准备:
    server1: 172.25.20.1 (主)
    server2: 172.25.20.2 (从)
    server3: 172.25.20.3 (从)
    安装包可以直接在官网https://redis.io/上下载,本机使用的是最新的redis-5.0.3

    tar zxf redis-5.0.3.tar.gz			##解压
    cd redis-5.0.3/						
    yum install gcc						##安装编译所需环境
    make && make install				##直接编译安装即可
    cd utils/
    ./install_server.sh					##使用默认配置即可,可以自动生成配置文件还有命令等
    

    在这里插入图片描述

    允许全网段访问并设置主从复制
    server1的主设置:
    vim /etc/redis/6379.conf		##修改配置文件
    /etc/init.d/redis_6379 stop		##重启服务
    /etc/init.d/redis_6379 start	
    

    在这里插入图片描述

    server2的从设置:
    vim /etc/redis/6379.conf		##修改配置文件
    /etc/init.d/redis_6379 stop		##重启服务
    /etc/init.d/redis_6379 start
    

    在这里插入图片描述
    在这里插入图片描述

    测试主从复制,在server1上写入数据,在server2上查看
    redis-cli		##进入数据库
    可以发现:
    redis的主从复制中只有mater是可写的,其他的普通节点默认都是只读的
    

    在这里插入图片描述
    在这里插入图片描述

    2.redis的高可用

    通过自带组件sentinel服务来实现主节点的自动切换,并且数据不会在切换中丢失
    再开启一个server3,按照server2配置

    sentinel是安装redis时自带的命令
    cd redis-5.0.3
    cp sentinel.conf /etc/redis/			##把sentinel的配置文件模板复制过去即可
    vim /etc/redis/sentinel.conf		##修改配置文件
    scp /etc/redis/sentinel.conf server2:/etc/redis/	##server1直接把修改后的文件发给server2和server3
    scp /etc/redis/sentinel.conf server3:/etc/redis/
    /etc/init.d/redis_6379 stop		##重启服务
    /etc/init.d/redis_6379 start
    

    在这里插入图片描述
    在这里插入图片描述

    启动sentinel服务的两种方法:
    redis-sentinel /etc/redis/sentinel.conf		##写上配置文件的位置
    redis-server /etc/redis/sentinel.conf --sentinel
    

    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    关闭server1的redis后
    redis-cli
    shoutdown		##进入数据库后关闭redis
    查看master的变化
    

    在这里插入图片描述
    连上新的master查看信息
    在这里插入图片描述
    在这里插入图片描述
    再次启用server1后再看
    在这里插入图片描述

    3.redis的持久化

    参考文档:http://www.redis.cn/topics/persistence.html

    (1).Redis 提供了不同级别的持久化方式:
    
        RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.
        AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存
    每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.
        如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.
        你也可以同时开启两种持久化方式, 在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF
    文件保存的数据集要比RDB文件保存的数据集要完整.
    
    (2).如何选择使用哪种持久化方式?
    
      一般来说, 如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。
      如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。
      有很多用户都只使用 AOF 持久化, 但我们并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 
    RDB 恢复数据集的速度也要比 AOF 恢复的速度要快, 除此之外, 使用 RDB 还可以避免之前提到的 AOF 程序的 bug 。
    

    4.redis的单机版集群搭建

    参考文档:http://www.redis.cn/topics/cluster-tutorial.html
    在一台主机上模拟6个节点来创建一个集群
    在redis 5.0以上可以直接通过内置安装脚本创建集群,方便快捷,集群创建的脚本位于/redis-5.0.3/utils/create-cluster/下
    redis的集群是无中心化的,写入数据时随机往哈希槽里写,超过一半的主master被连续关闭时(slave来不及接管master),即使它们有slave节点,整个集群也会被down掉,master数据的迁移实际上就是那一段哈希槽的迁移

    本次主要演示的是通过手动的方法来创建集群:

    cd /proc/sys/vm/		
    echo 1 > overcommit_memory			##当内存不够时不kill进程,放进swap交换分区里
    

    在这里插入图片描述

    cd 7001/
    vim redis.conf		##编辑一个配置文件
    port 7001
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes			##以追加的方式把命令保存在日志里
    daemonize yes			##打入后台运行
    
    每个目录以这个为模板,只修改端口号即可
    redis-server ./redis.conf		##启动服务
    ps -ef		##查看进程是否启动
    

    在这里插入图片描述

    redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
    127.0.0.1:7006 --cluster-replicas 1
    ##创建集群,1表示一个master有一个从节点
    

    在这里插入图片描述

    redis-cli --cluster info 127.0.0.1:7001			##随便查看一个节点节可以看到所有节点的信息
    redis-cli --cluster check 127.0.0.1:7001		##比info显示的信息更多,更完整,可以看到哈希槽的分布
    

    在这里插入图片描述
    在这里插入图片描述

    在集群中存入数据测试:
    redis-cli -c -p 7001	 ##-c开启集群模式,-p指定端口,虽然我们在7001上,但是存入的数据在7002,当我们查看数据时会自动切换到7002
    

    在这里插入图片描述
    在这里插入图片描述

    关掉存入数据的7002来查看数据的迁移
    注意:如果一个集群中连续宕掉半数以上的master,即使他们有slave节点,也会因为时间太短slave来不及接管数据,使整个集群都宕掉
    

    在这里插入图片描述
    在这里插入图片描述

    redis-server /usr/local/redis-cluster/7002/redis.conf			##重新启动server2
    在appendonly.aof中,通过aof持久化,把命令都追加在文件里
    

    在这里插入图片描述

    三、redis与mysql搭配使用的读写分离

    在本次实验中,客户端写入的数据都存储在mariadb数据库中,但是客户端读数据是通过redis来实现的

    1.环境准备

    server1: 安装php来访问
    server2:redis读缓存
    server3:mysql写入数据

    2.服务的实现

    server3的配置:
    yum install mariadb				##首先安装数据库服务
    systemctl start mariadb			##开启数据库服务
    注意:因为我们要用test库来测试,所以我们不做安全初始化
    将测试库里导入文件来查看,文件内容如下
    

    在这里插入图片描述

    mysql < test.sql
    mysql				##进入数据库查看我们导入的文件
    > use test;
    > select * from test;
    > grant all on test.* to redis@'%' identified by 'westos';		##给redis用户赋予对test库的操作哦权限
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    server1的配置:

    yum install httpd php php-mysql -y
    systemctl start httpd
    找一个php文件的模板放到默认发布目录下测试,注意自己mysql服务器的ip和redis服务器的ip
    vim /var/www/html/test.php
    <?php
            $redis = new Redis();
            $redis->connect('172.25.20.2',6379) or die ("could net connect redis server");
      #      $query = "select * from test limit 9";
            $query = "select * from test";
            for ($key = 1; $key < 10; $key++)
            {
                    if (!$redis->get($key))
                    {
                            $connect = mysql_connect('172.25.20.3','redis','westos');
                            mysql_select_db(test);
                            $result = mysql_query($query);
                            //如果没有找到$key,就将该查询sql的结果缓存到redis
                            while ($row = mysql_fetch_assoc($result))
                            {
                                    $redis->set($row['id'],$row['name']);
                            }
                            $myserver = 'mysql';
                            break;
                    }
                    else
                    {
                            $myserver = "redis";
                            $data[$key] = $redis->get($key);
                    }
            }
     
            echo $myserver;
            echo "<br>";
            for ($key = 1; $key < 10; $key++)
            {
                    echo "number is <b><font color=#FF0000>$key</font></b>";
     
                    echo "<br>";
     
                    echo "name is <b><font color=#FF0000>$data[$key]</font></b>";
     
                    echo "<br>";
            }
    ?>
    

    在这里插入图片描述

    加载php模块
    php -m   #查看所有
    php -m | grep mysql    #与mysql相关的,有3个
    php -m | grep redis   #与redis相关的,不存在,所以我们需要下载redis的php模块
    
    获取一个phpredis-master.zip
    unzip phpredis-master.zip
    cd phpredis-master
    phpize		##这个时候会报错,因为我们缺少依赖
    yum install php-devel -y 	##安转所需依赖后再试
    

    注意:phpize是一个可运行脚本,主要作用是检测php的环境还有就是在特定的目录生成相应的configure文件,这样make install之后,生成的.so文件才会自动加载到php扩展目录下面。
    在这里插入图片描述
    在这里插入图片描述

    ./configure --enable-redis		##生成makefile时添加允许redis参数
    make && make install			##编译安装
    cd  /etc/php.d/
    cp mysql.ini redis.ini			##生成redis的文件,并写入redis的.so
    vim redis.ini
    vim /etc/php.ini				##修改时区
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在浏览器上访问测试:
    在这里插入图片描述
    但是现在数据是不同步的,比如我们在mysql上修改一个数据,通过redis读取数据时它读的还是本地的缓存,把缓存删除掉才会看到修改后的信息

    在server3上修改数据:
    mysql
    > use test;
    > update test set name='yy' where id='1';
    
    在server2上查看redis的数据测试
    

    在这里插入图片描述在这里插入图片描述

    3.redis与mysql数据不同步的解决方法

    我们这里利用Gearman这个工具,让mysql中数据有更新时,主动触发redis进行同步。
    redis只有在他的数据过期或没有缓存的时侯才会去找mysql拿数据,所以我们希望在mysql有update操作后,会自动的触发redisserver。
    数据流向:job(mysql trigger) mysql-gearman ----> gearman server ----> worker(php-gearman、php-redis、 set)

    首先获取gearman软件包,同时它还有相应的依赖
    本次实验所用软件版本如下,下载到同一个目录后,直接yum install *.rpm 即可
    

    在这里插入图片描述
    开启gearman服务,查看所用端口为4730

    systemctl start gearmand
    netstat -antlp
    

    在这里插入图片描述
    编写gearman的worker端。修改worker.php文件,将redis的ip改为我们redis服务器的ip

    vim worker.php
    <?php
    $worker = new GearmanWorker();
    $worker->addServer();
    $worker->addFunction('syncToRedis', 'syncToRedis');
    
    $redis = new Redis();
    $redis->connect('172.25.20.2', 6379);
    
    while($worker->work());
    function syncToRedis($job)
    {
            global $redis;
            $workString = $job->workload();
            $work = json_decode($workString);
            if(!isset($work->id)){
                    return false;
            }
            $redis->set($work->id, $work->name);    
         ##这条语句就是将 id 作 KEY 和name 作 VALUE 分开存储,需要和前面写的 php 测试代码的存取一致。
    }
    ?>
    php -m | grep gearman		##查看gearman的php组件是否生效
    

    下载php的gearman扩展,解压,并进行phpize。
    在这里插入图片描述
    直接./configure即可,不用添加参数
    在这里插入图片描述

    cd /etc/php.d/
    cp redis.ini gearman.ini		##把gearman.so写入gearman.ini
    systemctl restart httpd			##重启服务,因为gearman
    

    在这里插入图片描述
    将修改后的php文件移至/usr/local下,用php以静默的模式运行

    mv worker.php /usr/local/
    nohup php /usr/local/worker.php &    #后台运行worker
    ps ax
    

    在这里插入图片描述
    注意:我们这里把gearman server和处理job的gearman worker放在同一台主机了,实际生产环境中是分离的。
    (2)server3的数据库配置

    首先修改之前的test.sql文件,然后再次把文件导入mysql
    mysql < test.sql
    

    在这里插入图片描述
    在这里插入图片描述
    可以发现我们导入失败了,因为我们缺少了lib_mysqludf_json。lib_mysqludf_json UDF库函数将关系数据映射成json格式,通常,数据库中的数据映射成json格式是通过程序来转换的。(因为mysql与redis的数据类型不同所以必须转换为json标准数据类型。)

    yum install gcc -y
    yum install mysql-devel -y   #安装所需依赖
    此时,我们查看mysql的模块目录
    MariaDB [(none)]> show global variables like 'plugin_dir';
    ##这个路径我们可以在mysql中查询得知
    

    在这里插入图片描述
    在这里插入图片描述

    cp ~/lib_mysqludf_json-master/lib_mysqludf_json.so /usr/lib64/mysql/plugin/
    ll lib_mysqludf_json.so 
    

    在这里插入图片描述
    安装gearman-mysql-udf,这个插件用来管理调用gearman的分布式的队列。
    本机使用的版本是gearman-mysql-udf-0.6.tar.gz

    tar zxf gearman-mysql-udf-0.6.tar.gz
    cd gearman-mysql-udf-0.6
    yum install -y gearmand-1.1.12-18.el7.x86_64.rpm libgearman-1.1.12-18.el7.x86_64.rpm \
      libgearman-devel-1.1.12-18.el7.x86_64.rpm libevent-devel-2.0.21-4.el7.x86_64.rpm 
    ##与server1安装时需要的依赖相同
    ./configure --with-mysql --libdir=/usr/lib64/mysql/plugin
    make && make install		##编译安装
    

    此时模块目录下出现了我们安装的gearman_mysql_udf的模块。
    在这里插入图片描述
    注册并查看UDF函数。
    在这里插入图片描述
    指定gearman服务的信息,这里gearman服务器为server1,端口为4730。

    MariaDB [(none)]> SELECT gman_servers_set('172.25.20.1:4730');
    

    在这里插入图片描述
    再次导入数据库测试:

    mysql < test.sql
    MariaDB [(none)]> SHOW TRIGGERS FROM test;    #查看触发器
    

    在这里插入图片描述
    (3)测试
    更新server3中mysql的数据,在浏览器上查看

    mysql
    MariaDB [test]> update test set name='test1' where id='1';		##把刚才修改的yy改回test1
    

    在这里插入图片描述

    展开全文
  • 在SQL数据库中,如果一个日期字段用Char来存储,如何将数据库中的字段在执行SQL语句时转为日期,并且比较时间前后,下面这条SQL语句作为模板,实现上述功能。  strSQL = "select * from Charge_Info where ...

         在SQL数据库中,如果一个日期字段用Char型来存储,如何将数据库中的字段在执行SQL语句时转为日期型,并且比较时间前后,下面这条SQL语句作为模板,实现上述功能。

       strSQL = "select * from Charge_Info where cast(convert(varchar,date) as datetime) between '" & strStartDate & "' and '" & strEndDate & "'"

       date为Charge_Info表中需要转换的字段名,大家只需更改表名Charge_Info和字段名date,strStartDate为起始日期,strEndDate为终止日期

    展开全文
  • 在SQL数据库中,如果一个日期字段用Char来存储,如何将数据库中的字段在执行SQL语句时转为日期,并且比较时间前后,下面这条SQL语句作为模板,实现上述功能。 strSQL = "select * from Charge_Info where ...
    在SQL数据库中,如果一个日期字段用Char型来存储,如何将数据库中的字段在执行SQL语句时转为日期型,并且比较时间前后,下面这条SQL语句作为模板,实现上述功能。
    strSQL = "select * from Charge_Info where cast(convert(varchar,date) as datetime) between '" & strStartDate & "' and '" & strEndDate & "'"
    date为Charge_Info表中需要转换的字段名,大家只需更改表名Charge_Info和字段名date,strStartDate为起始日期,strEndDate为终止日期
    展开全文
  • 数据库表示

    2019-04-25 17:59:14
    为了让初学者能够更好地理解一些命令,我把关键字一律小写 表的建立 : 在这里插入代码片 ...name1 char(9) primary key, //该列为字符型申请9个空间,为主码 name2 int not null, ...
  • 对于程序中的string字段,SQLServer中有char、varchar、nchar、nvarchar四种类型来对应(暂时不考虑text和ntext),开建立数据库中,对这四种类型往往比较模糊,这里做一下对比。 定长或变长所谓定长就是长度固定...
  • oracle 字符型函数

    2018-03-05 11:01:34
    1. ASCII【语法】: ASCII(string)【说明】: 返回字符表达式最左端字符的ASCII 码值,如果最左端是汉字,只取汉字最左半边字符的ASCII 码【功能】: 数据库字符集返回string的第一个字节的十进制表示.请注意该函数...
  • SDS(Simple Dynamic String,简单动态字符串)是 Redis 底层所使用的字符表示。 SDS比C语言的字符串多了一个SDSHDR表头,存放了free(空闲空间)、len(已用空间)、buf(缓冲区)。 优点: (1)获取字符串长度更快。...
  • 邮政编码(YZhBM):普通编码定长字符型,6位长,每一位必须是数字,允许空 2. 产品表(CPB)包括如下字段: 产品号(CPH):普通编码定长字符型,6位长,主码 产品名(CPM):普通编码可变长字符型,20位长,非空 ...
  • 常用的有:字符串,整型,日期等。 约束 唯一约束:表示不能重复了。 不区分大小写 SQL语言的分类 DDL:数据定义语言,对表的结构进行增删改。create,drop,alter。 TCL:事务控制语言,提交,回滚。commit,rollback ...
  • 1.数据表中。 关于状态的字段,只有 一个Int类型的字段,比如下方:...02.显示数据调用的是字符型字段。 JavaBean的处理如下。 4.显示层 插入数据时,要进行转换。 关于状态字段的思考 数据库表设计的问题 在项目的...
  • Less-4错误型GET双引号字符型注入 实验漏洞复现介绍 该实验与Less-3错误型GET单引号变形字符型注入 区别在于,构建payload更改")单引号;)表示变形! 1、爆开数据库 payload ?id=0") union select 1,2,...
  • 在oracle数据库中,dual表示真实存在的,它本身包含了一个DUMMY字段,如果用户删除了该表,则oracle将无法启动。其中函数MOD(n1,n2)求余,当n2为0时,返回的是n1。SIGN(n)函数,返回参数n的符号。即正数返回1,负数...
  • Less-3错误型GET单引号变形字符型注入 什么是sql变形字符串注入?最常见的有: 1、将查询条件转为base64 2、本实验用)来实现变形; 3、宽字节字体编码利用,例如gbk中文字符,这种比较难用;例如试图用%df%5c%27...
  • 一、什么是字符型注入以及原理 1)字符型注入简介 字符串或串(String)是...字符型注入就是把输入的参数当做字符串来对数据库进行查询,字符型注入在sql语句中都采用单引号括起来。 2)基本原理: 看看这条SQL语
  • 1.关系型数据库永久性保存数据的仓库php的变量只是php脚本执行期间,临时性保存变量的空间【使用内存空间临时保存】 ...nosql:not only sql【sql表示操作关系数据的语言】所以nosql指的就是非关系...
  • 一、什么是字符型注入以及原理1)字符型...字符型注入就是把输入的参数当做字符串来对数据库进行查询,字符型注入在sql语句中都采用单引号括起来。2)基本原理:看看这条SQL语句[html] view plain copy$query="...
  • int,int(10),10表示数字的位数,但是好像没啥用,存的数字位数超过10位,可以显示,不超过10位的,实际数字前面补0(实际0不现实)如果字段的数据类型是int,但是给个字符数,如果字符串是纯数字,会自动转为int。...
  • 字符串类型 一、数值类型 整数 tinyint[M] [unsigned] [zerofill] // [ ] 表示可选,这里的M表示显示宽度,并不是取值范围,显示宽度不够前面以0填充 bool是tinyint(1)的别名 浮点 IEEE 754浮点数...
  • % 表示任意零或多个字符 _ 表示任意一个字符 使用IS NULL运算符进行空值判断 小括号的作用 改变运算顺序 提高可读性 2、函数 单行函数 字符串函数 数值函数 日期与时间函数 流程函数 IF...
  • oracle没有相关命令和设置,建议设计表是不要用长数字类型,用字符型。 另外如果是PL/SQL developer 工具的话,可以这样设置: TOOLS->PREFERENCES->WINDOW TYPE->SQL WINDOW下选中Number fields to_char;
  • 所有字符串均以大写字母表示。 非ASCII土耳其语字符将转换为ASCII(Ü-> U,Ö-> O,İ-> I,Ş-> S,Ğ-> G,Ç-> C)。 原始数据以文本形式给出。 我使用了简单的Python脚本来提取相关数据并进行计数。 我还使用...
  • 对于关系的每个属性,都存在一个允许取值的集合,称为该属性的域(domain),例如整数型、字符型、日期\时间型。空null值是所有域的成员,表示值未知或不存在。 关系模型和关系实例 关系的概念对
  • 数据库参数

    2014-09-18 00:45:11
    第十章 数据库参数  PostgresSQL提供了许多数据库配置参数...每个参数的取值是布尔、整型、浮点字符这四种类型中的一个,分别用boolean、integer、floating point和string表示。布尔的值可以写成ON
  • 数据库设计

    2019-01-25 03:44:19
    1.数据库设计要点分析 字段类型 mysql的数据类型 数值:整型,tyint ,samllint mediumint int bigint 小数 float decimal 字符串:varchar char text enum set 日期时间:datetime date time timestamp. ...
  • MySQL数据库中支持多种数据类型:数值型、字符型、日期型 常用的数据类型: 1.整型 int:整形,存储整数 int(M):M表示预期值。与存储大小和数值的范围无关。 id int 10000 ...
  • Oracle字符串操作字符串操作CHAR和VARCHAR2类型· 表示字符串数据类型,用来在表中存放字符串信息,比如姓名、职业、地址等;· CHAR存放定长字符,即存不满补空格;VARCHAR2存放变长字符,存多少占用多少;· 举例...

空空如也

空空如也

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

数据库字符型表示