精华内容
下载资源
问答
  • SSH-1 员工增删查案例

    千次阅读 2017-03-22 20:59:40
    基于SSH框架的员工增删查小案例的实现代码下载地址:http://download.csdn.net/download/bingbeichen/9790372。

    1. 基本需求

      基于SSH框架的员工增删改查小案例的具体需求如下图所示:
      这里写图片描述


    2. 实现步骤

    2.1 搭建SSH框架环境

    第一步:添加Spring4框架,具体步骤如下:

    • 加入Spring4框架所依赖的jar包;
    • 配置web.xml文件使其能够在WEB应用中正常使用;
    • 添加Spring的Bean配置。

    第二步:添加Hibernate4框架,具体步骤如下:

    • 加入Hibernate4所依赖的jar包;
    • 在类路径下创建hibernate.cfg.xml配置文件,用于配置hibernate的基本属性;
    • 建立所需要的持久化类及其对应的对象关系映射文件*.hbm.xml;
    • 与Spring4进行整合,即添加C3P0数据源和MySQL数据库的驱动,并在Spring的Bean配置文件中配置数据源、SessionFactory和声明式事务;
    • 配置成功后,启动当前WEB应用即可生成对应的数据表。

    第三步:添加Struts2框架,具体步骤如下:

    • 加入Struts2框架所依赖的jar包,若有重复则删除版本较低的jar包;
    • 在web.xml文件中配置Struts2的过滤器;
    • 添加Struts2的配置文件;
    • 与Spring4进行整合,主要包括:
      • 加入Struts2的Spring插件,即struts2-spring-plugin-2.3.31.jar;
      • 在Spring的Bean配置文件中正常配置Action,要求其scope属性必须为prototype;
      • 在Struts2的配置文件中配置Action,其class属性需指向该Action在IoC容器中所配置的id。

    2.2 显示所有员工信息

      EmployeeAction类中list()方法的核心代码如下所示:

    /**
     * 功能一:查询并显示所有员工信息 
     * 注意事项: 
     *  1). 在事务作用范围之外访问员工的部门名称可能会出现懒加载异常,采用迫切左外连接查询或使用OpenSessionInViewFilter来实现
     *  2). 通过实现RequestAware接口来获取request,将获取的员工信息放入其属性中,即可在显示页面获取并显示
     * @return
     */
    public String list() {
        /**
         * System.out.println(employeeService.getAll()); //会出现懒加载异常
         * 事务作用的EmployeeService的getAll()方法上,其执行完毕即提交事务,此时打印员工的部门信息即会出现异常
         */
        request.put("EMPLOYEES", employeeService.getAll());
        return "list";
    }

    2.3 删除当前员工信息

      执行删除后需要将返回值设置为redirect类型,并重定向到emp-list;其中,删除时的提示信息和Ajax请求实现的核心代码如下所示:

    <!-- Ajax的具体使用参看struts-2.3.31/docs/docs/ajax.html -->
    <script type="text/javascript" src="scripts/jquery-1.7.2.js"></script>
    <script type="text/javascript">
    
        $(function() {
            // 1). 弹出信息提示框
            $(".delete").click(function() {
                var name = $(this).next(":input").val();
                var flag = confirm("确定要删除" + name + "的信息吗?");
                if(flag) {
                    // 2). 删除员工的信息
                    var $tr = $(this).parent().parent();
                    // 发送删除请求
                    var url = this.href;
                    var args = {"times":new Date()}; //用于禁用缓存
                    $.post(url, args, function(data) {
                        if(data == "1") {
                            alert("恭喜您,删除成功!");
                            if($tr.siblings().length == 0) {
                                $tr.parent().parent().remove();
                            }
                            $tr.remove();
                        } else {
                            alert("对不起,删除失败!");
                        }
                    });
                }
    
                // 取消超链接的默认行为
                return false;
            });
        });
    </script>

    2.4 添加新的员工信息

      显示表单页面时,需要先查询出所有的部门信息;需要使用Struts2的ModelDriven和Preparable拦截器;也需要自定义转换器将时间字符串转为日期对象。其中,Ajax校验员工名的核心代码如下所示:

    <script type="text/javascript" src="scripts/jquery-1.7.2.js"></script>
    <script type="text/javascript">
        $(function() {
            $(":input[name=name]").change(function() {
    
                var nameval = $(this).val();
                nameval = $.trim(nameval);
                $this = $(this);
                if(nameval != "") {
                    $this.nextAll("font").remove();
                    var url = "emp-validateName";
                    var args = {"name":nameval, "time":new Date()};
                    $.post(url, args, function(data) {
                        if(data == "1") {
                            $this.after("<font color='green'>恭喜您,员工名可用!</font>");
                        } else if (data == "0") {
                            $this.after("<font color='red'>对不起,员工名不可用!</font>");
                        } else {
                            alert("服务器异常,请重试!");
                        }
                    });
                } else {
                    alert("对不起,员工姓名不能为空!");
                    $(this).val("");
                }
            });
        });
    </script>

    2.5 修改指定员工信息

      需要回显当前员工的信息,并设置其员工名不可修改。


    3. 具体实现

      基于SSH框架的员工增删改查小案例的实现代码下载地址:http://download.csdn.net/download/bingbeichen/9790372

    代码目录结构:

        这里写图片描述

    EmployeeAction.java:

    package com.qiaobc.ssh.actions;
    
    import java.io.ByteArrayInputStream;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.util.Date;
    import java.util.Map;
    
    import org.apache.struts2.interceptor.RequestAware;
    
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    import com.opensymphony.xwork2.Preparable;
    import com.qiaobc.ssh.entities.Employee;
    import com.qiaobc.ssh.service.DepartmentService;
    import com.qiaobc.ssh.service.EmployeeService;
    
    public class EmployeeAction extends ActionSupport implements RequestAware, ModelDriven<Employee>, Preparable {
    
        private static final long serialVersionUID = 1L;
    
        private EmployeeService employeeService;
        private DepartmentService departmentService;    
    
        public void setEmployeeService(EmployeeService employeeService) {
            this.employeeService = employeeService;
        }
    
        public void setDepartmentService(DepartmentService departmentService) {
            this.departmentService = departmentService;
        }
    
        /**
         * 功能一:查询并显示所有员工信息 
         * 注意事项: 
         *  1). 在事务作用范围之外访问员工的部门名称可能会出现懒加载异常,采用迫切左外连接查询 
         *  2). 通过实现RequestAware接口来获取request,将获取的员工信息放入其属性中,即可在显示页面获取并显示
         * 
         * @return
         */
        public String list() {
            /**
             * System.out.println(employeeService.getAll()); //会出现懒加载异常
             * 事务作用的EmployeeService的getAll()方法上,其执行完毕即提交事务,此时打印员工的部门信息即会出现异常
             */
            request.put("EMPLOYEES", employeeService.getAll());
            return "list";
        }
    
        private Map<String, Object> request;
    
        @Override
        public void setRequest(Map<String, Object> arg0) {
            this.request = arg0;
        }
    
        /**
         * 功能二-1:正常删除当前员工的信息 
         * 注意事项:根据员工id删除当前员工信息后需要重定向到emp-list,以防止删除操作的重复提交
         */
        /*
         * public String delete() { employeeService.delete(id); return "delete"; }
         */
        private Integer id;
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        private InputStream inputStream;
    
        public InputStream getInputStream() {
            return inputStream;
        }
    
        /**
         * 功能二-2:使用Ajax删除当前员工的信息,需要使用jQuery弹出信息提示框
         * Ajax的具体使用参见struts-2.3.31/docs/docs/ajax.html,与Struts2的文件下载类似
         */
        public String delete() {
            try {
                employeeService.delete(id);
                inputStream = new ByteArrayInputStream("1".getBytes("UTF-8"));
            } catch (Exception e) {
                e.printStackTrace();
                try {
                    inputStream = new ByteArrayInputStream("0".getBytes("UTF-8"));
                } catch (UnsupportedEncodingException e1) {
                    e1.printStackTrace();
                }
            }
            return "ajax-success";
        }
    
        /**
         * 功能三:添加员工信息
         *  1). 显示表单页面:需要先查询所有的部门信息
         *  2). 使用Struts2的ModelDriven和Preparable拦截器
         *  3). 需要将时间字符串转为日期对象
         */
        public String input() {
            // 获取所有的部门信息
            request.put("DEPARTMENTS", departmentService.getDepartments());
            return "input";
        }
    
        public void prepareInput() {
            if(id != null) {
                model = employeeService.get(id);
            }
        }
    
        @Override
        public void prepare() throws Exception {}
    
        private Employee model;
    
        @Override
        public Employee getModel() {
            return model;
        }
    
        public String save() {
            if(id == null) {
                model.setCreateTime(new Date());
            }
            employeeService.saveOrUpdate(model);
            return "save";
        }
    
        /**
         * 可以根据id来判断是从数据库获取model还是创建新的model
         * @return
         */
        public void prepareSave() {
            if(id == null) {
                model = new Employee();
            } else {
                model = employeeService.get(id);
            }
        }
    
        private String name;
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String validateName() throws UnsupportedEncodingException {
            if(employeeService.validateName(name)) {
                inputStream = new ByteArrayInputStream("1".getBytes("UTF-8"));
            } else {
                inputStream = new ByteArrayInputStream("0".getBytes("UTF-8"));
            }
            return "ajax-success";
        }
    }

    SSHDateConverters.java:

    package com.qiaobc.ssh.converters;
    
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;
    
    import org.apache.struts2.util.StrutsTypeConverter;
    
    public class SSHDateConverters extends StrutsTypeConverter {
    
        private DateFormat dateFormat;
    
        {
            dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        }
    
        @Override
        public Object convertFromString(Map context, String[] values, Class toClass) {
            System.out.println("convertFromString");
            if(toClass == Date.class) {
                try {
                    return dateFormat.parse(values[0]);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
            return values;
        }
    
        @Override
        public String convertToString(Map context, Object o) {
            System.out.println("convertToString");
            if(o instanceof Date) {
                return dateFormat.format((Date) o);
            }
            return null;
        }
    }

    BaseDao.java:

    package com.qiaobc.ssh.dao;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    
    public class BaseDao {
    
        private SessionFactory sessionFactory;
    
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
    
        public Session getSession() {
            Session session = this.sessionFactory.getCurrentSession();
            return session;
    //      return this.sessionFactory.getCurrentSession();
        }
    
    }
    

    DepartmentDao.java:

    package com.qiaobc.ssh.dao;
    
    import java.util.List;
    
    import com.qiaobc.ssh.entities.Department;
    
    public class DepartmentDao extends BaseDao {
    
        /**
         * 查询所有的部门信息
         */
        @SuppressWarnings("unchecked")
        public List<Department> getDepartments() {
            String hql = "FROM Department";
            return getSession().createQuery(hql).list();
        }
    }

    EmployeeDao.java:

    package com.qiaobc.ssh.dao;
    
    import java.util.List;
    
    import com.qiaobc.ssh.entities.Employee;
    
    public class EmployeeDao extends BaseDao {
    
        @SuppressWarnings("unchecked")
        public List<Employee> getAll() {
            // 使用迫切左外连接查询防止出现懒加载异常
            String hql = "FROM Employee e LEFT JOIN FETCH e.dept";
            return getSession().createQuery(hql).list();
        }
    
        public void delete(int id) {
            String hql = "DELETE FROM Employee e WHERE e.id = ?";
            getSession().createQuery(hql).setInteger(0, id).executeUpdate();
        }
    
        public void saveOrUpdate(Employee employee) {
            getSession().saveOrUpdate(employee);
        }
    
        public Employee validateName(String name) {
            String hql = "FROM Employee e WHERE e.name = ?";
            return (Employee) getSession().createQuery(hql).setString(0, name).uniqueResult();
        }
    
        public Employee get(Integer id) {
            return (Employee) getSession().get(Employee.class, id);
        }
    }
    

    EmployeeService.java:

    package com.qiaobc.ssh.service;
    
    import java.util.List;
    
    import com.qiaobc.ssh.dao.EmployeeDao;
    import com.qiaobc.ssh.entities.Employee;
    
    public class EmployeeService {
    
        private EmployeeDao employeeDao;
    
        public void setEmployeeDao(EmployeeDao employeeDao) {
            this.employeeDao = employeeDao;
        }
    
        public List<Employee> getAll() {
            List<Employee> emps = employeeDao.getAll();
            return emps;
        }
    
        public void delete(int id) {
            employeeDao.delete(id);
        }
    
        public void saveOrUpdate(Employee employee) {
            employeeDao.saveOrUpdate(employee);
        }
    
        public boolean validateName(String name) {
            return employeeDao.validateName(name) == null;
        }
    
        public Employee get(Integer id) {
            return employeeDao.get(id);
        }
    }

    applicationContext-beans.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
    
        <!-- 配置Struts2的Action所对应的bean:设置其scope属性为prototype -->
        <bean id="employeeAction" class="com.qiaobc.ssh.actions.EmployeeAction" scope="prototype">
            <property name="employeeService" ref="employeeService"></property>
            <property name="departmentService" ref="departmentService"></property>
        </bean>
    
        <bean id="employeeDao" class="com.qiaobc.ssh.dao.EmployeeDao">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
    
        <bean id="employeeService" class="com.qiaobc.ssh.service.EmployeeService">
            <property name="employeeDao" ref="employeeDao"></property>
        </bean>
    
        <bean id="departmentDao" class="com.qiaobc.ssh.dao.DepartmentDao">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
    
        <bean id="departmentService" class="com.qiaobc.ssh.service.DepartmentService">
            <property name="departmentDao" ref="departmentDao"></property>
        </bean>
    
    </beans>

    applicationContext.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
        <!-- 配置数据源:配置完后可测试其是否配置成功 -->
        <context:property-placeholder location="classpath:db.properties"/>
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="user" value="${jdbc.user}"></property>
            <property name="password" value="${jdbc.password}"></property>
            <property name="driverClass" value="${jdbc.driverClass}"></property>
            <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
            <property name="initialPoolSize" value="${jdbc.initialPoolSize}"></property>
            <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
        </bean>
    
        <!-- 配置Hibernate的SessionFactory实例:通过Spring提供的LocalSessionFactoryBean进行配置 -->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    
            <!-- 配置数据源属性 -->
            <property name="dataSource" ref="dataSource"></property>
    
            <!-- 配置Hibernate配置文件的位置及名称 -->
            <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
    
            <!-- 配置Hibernate映射文件的位置及名称:可以使用通配符 -->
            <property name="mappingLocations" value="classpath:com/qiaobc/ssh/entities/*.hbm.xml"></property>
        </bean>
    
        <!-- 配置声明式事务 -->
        <!-- 1). 配置事务管理器 -->
        <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
    
        <!-- 2). 配置事务属性 -->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="get*" read-only="true"/>
                <tx:method name="*"/>
            </tx:attributes>
        </tx:advice>
    
        <!-- 3). 配置事务切入点、关联事务属性 -->
        <aop:config>
            <aop:pointcut expression="execution(* com.qiaobc.ssh.service.*.*(..))" id="txPointcut"/>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
        </aop:config>
    
    </beans>
    

    db.properties:

    jdbc.user=root
    jdbc.password=root
    jdbc.driverClass=com.mysql.jdbc.Driver
    jdbc.jdbcUrl=jdbc:mysql:///spring
    
    jdbc.initialPoolSize=5
    jdbc.maxPoolSize=10

    hibernate.cfg.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
    
            <!-- 配置Hibernate的基本属性:方言、SQL显示与格式化、数据表生成策略、二级缓存相关 -->
    
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
    
            <property name="hibernate.show_sql">true</property>
            <property name="hibernate.format_sql">true</property>
    
            <property name="hibernate.hbm2ddl.auto">update</property>
    
        </session-factory>
    </hibernate-configuration>
    

    struts.xml:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
    
        <package name="ssh-emps" namespace="/" extends="struts-default">
    
            <!-- 定义新的拦截器栈,配置prepare拦截器栈的alwaysInvokePrepare属性为false -->
            <interceptors>
                <interceptor-stack name="sshEmpsStack">
                    <interceptor-ref name="paramsPrepareParamsStack">
                        <param name="prepare.alwaysInvokePrepare">false</param>
                    </interceptor-ref>
                </interceptor-stack>
            </interceptors>
    
            <!-- 使用新配置的拦截器栈 -->
            <default-interceptor-ref name="sshEmpsStack"></default-interceptor-ref>
    
            <action name="emp-*" class="employeeAction" method="{1}">
                <result name="list">/WEB-INF/views/emp-list.jsp</result>
                <result name="delete" type="redirect">/emp-list</result>
                <result name="ajax-success" type="stream">
                    <param name="contentType">text/html</param>
                    <param name="inputName">inputStream</param>
                </result>
                <result name="input">/WEB-INF/views/emp-input.jsp</result>
                <result name="save" type="redirect">/emp-list</result>
            </action>
    
        </package>
    
    </struts>
    

    emp-list.jsp:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    
    <script type="text/javascript" src="scripts/jquery-1.7.2.js"></script>
    <script type="text/javascript">
    
        $(function() {
            // 1). 弹出信息提示框
            $(".delete").click(function() {
                var name = $(this).next(":input").val();
                var flag = confirm("确定要删除" + name + "的信息吗?");
                if(flag) {
                    // 2). 删除员工的信息
                    var $tr = $(this).parent().parent();
                    // 发送删除请求
                    var url = this.href;
                    var args = {"times":new Date()}; //用于禁用缓存
                    $.post(url, args, function(data) {
                        if(data == "1") {
                            alert("恭喜您,删除成功!");
                            if($tr.siblings().length == 0) {
                                $tr.parent().parent().remove();
                            }
                            $tr.remove();
                        } else {
                            alert("对不起,删除失败!");
                        }
                    });
                }
    
                // 取消超链接的默认行为
                return false;
            });
        });
    
    </script>
    
    <body>
    
        <s:debug></s:debug>
        <br>
    
        <s:if
            test="#request.EMPLOYEES == null || #request.EMPLOYEES.size() == 0">
            <h4>暂没有任何员工信息...</h4>
        </s:if>
        <s:else>
            <table border="1" cellpadding="10" cellspacing="0">
                <thead>
                    <tr>
                        <td>ID</td>
                        <td>NAME</td>
                        <td>EMAIL</td>
                        <td>BIRTHDAY</td>
                        <td>CREATETIME</td>
                        <td>DEPARTMENT</td>
                        <td>DELETE</td>
                        <td>EDIT</td>
                    </tr>
                </thead>
                <tbody>
                    <s:iterator value="#request.EMPLOYEES">
                        <tr>
                            <td>${id }</td>
                            <td>${name }</td>
                            <td>${email }</td>
                            <td>
                                <s:date name="birth" format="yyyy-MM-dd"/>
                            </td>
                            <td>
                                <s:date name="createTime" format="yyyy-MM-dd hh-mm-ss"/>
                            </td>
                            <td>${dept.name }</td>
                            <td>
                                <a href="emp-delete?id=${id }" class="delete">Delete</a>
                                <input type="hidden" value="${name }">
                            </td>
                            <td><a href="emp-input?id=${id }">Edit</a></td>
                        </tr>
                    </s:iterator>
                </tbody>
            </table>
        </s:else>
    </body>
    </html>

    emp-input.jsp:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    
    <script type="text/javascript" src="scripts/jquery-1.7.2.js"></script>
    <script type="text/javascript">
    
        $(function() {
            $(":input[name=name]").change(function() {
    
                var nameval = $(this).val();
                nameval = $.trim(nameval);
                $this = $(this);
                if(nameval != "") {
                    $this.nextAll("font").remove();
                    var url = "emp-validateName";
                    var args = {"name":nameval, "time":new Date()};
                    $.post(url, args, function(data) {
                        if(data == "1") {
                            $this.after("<font color='green'>恭喜您,员工名可用!</font>");
                        } else if (data == "0") {
                            $this.after("<font color='red'>对不起,员工名不可用!</font>");
                        } else {
                            alert("服务器异常,请重试!");
                        }
                    });
                } else {
                    alert("对不起,员工姓名不能为空!");
                    $(this).val("");
                }
            });
        });
    
    </script>
    
    <body>
    
        <h4>Add New Employee:</h4>
    
        <s:form action="emp-save" method="post">
            <s:if test="id != null">
                <s:textfield label="Name" name="name" disabled="true"></s:textfield>
                <s:hidden name="id"></s:hidden>
                <!-- 可以通过添加隐藏域的方式将未提交的name和createTime字段值提交到服务器
                    <s:hidden name="name"></s:hidden>
                    <s:hidden name="createTime"></s:hidden>
                 -->
            </s:if>
            <s:else>
                <s:textfield label="Name" name="name"></s:textfield>
            </s:else>
            <s:textfield label="Email" name="email"></s:textfield>
            <s:textfield label="Birth" name="birth"></s:textfield>
    
            <s:select list="#request.DEPARTMENTS" 
                listKey="id" listValue="name" 
                label="Department" name="dept.id"></s:select>
    
            <s:submit></s:submit>
        </s:form>
    
    </body>
    </html>
    展开全文
  • 利用折半查找法(二分查找法)查找员工编号并输出员工的相关资料 #include #include #define N 5#define M 30int flag=1; /*全局变量,用于判断search函数的搜索结果*/main(){int num[N],i,j,n;char name[N][M];...

     

    利用折半查找法(二分查找法)查找员工编号并输出员工的相关资料

     

    #include <stdio.h>
    #include <string.h>
    #define N 5
    #define M 30
    int flag=1;                               /*全局变量,用于判断search函数的搜索结果*/
    main()
    {
    int num[N],i,j,n;
    char name[N][M];
    system("cls");
    printf("please input %d employees information./n",N);       /*employee:员工、职员、雇员*/
    for(i=0;i<N;i++)
    {
    printf("NO.%d: ",i+1);
    scanf("%d ",&num[i]);          /*注意%d之后有个空格,此空格的作用是回收掉数字字符之后至非数字字符以前的全部空格字符,以使打印员工姓名时,名字前面没有空格字符。注意,如果%d后加了空格,search函数中的整形变量low的初值必须赋为0,否则可为1*/
    for(;!(num[i]>=0&&num[i]<=32767);)                    /*因为数组num被定义为int型,所以当num[i]的值大于32767时就提示有错,并要求重新赋值*/
    {
    printf("Error! Input again: /a");
    scanf("%d ",&num[i]);
    }
    gets(name[i]);                     /*用gets函数作为输入语句的好处在于可以输入空格,而使用scanf("%s",&name[i])的话,输入时一旦遇到空格,空格以后的字符就将被下一组元素所接收,会影响程序的输出结果*/
    }
    system("cls");
    printf("All information:/n");
    for(i=0;i<N;i++)
    printf("No.%d: employee:%s, Number:%d/n",i+1,(name[i][0]=='')?strcat(name[i],"NONE"):name[i],num[i]);
    puts('');
    than(num,name);
    printf("Input will search number: ");
    scanf("%d",&n);
    j=search(num,n);
    if(!flag) printf("Can't find '%d', search is not success./n",n);                          /*success:成功*/
    else printf("'%d' position is %d, name is %s./n",n,j+1,name[j]);                  /*position:位置*/
    }

    than(int str[],char st[][M])                                       /*自定义函数than用于顺序排列员工编号和姓名*/
    {
    int i,j,max;
    char temp[M];
    for(i=0;i<N-1;i++)
    for(j=i+1;j<N;j++)
    if(str[i]>str[j])                                                     /*如果把if(str[i]>str[j])改为if(str[i]<str[j]),则是按从大到小的顺序对数组进行重新排列*/
    {
    max=str[i];
    str[i]=str[j];
    str[j]=max;
    strcpy(temp,st[i]);                                              /*注意系统函数strcpy的使用方法*/
    strcpy(st[i],st[j]);                                                 /*注意系统函数strcpy的使用方法*/
    strcpy(st[j],temp);                                              /*注意系统函数strcpy的使用方法*/
    }
    for(i=0;i<N;i++)
    printf("New:%d, %s/n",str[i],st[i]);                  /*输出顺序排列后的数组元素*/
    }

    int search(int str[],int n)                                   /*自定义函数search用于查找输入的编号*/
    {
    int low=0,high=N,mid=0;                                /*low表示第一个数组元素序列,high表示数组元素的总数*/
    if(n<str[0]||n>str[high-1]) {flag=0;return 0;}
    while(low<=high)                                                                    
    {                                                                                                  
    mid=(low+high)/2;                                                                    
    if(n>str[mid]) low=mid+1;                                                      
    else if(n<str[mid]) high=mid-1;                                            
    else return mid;                                                                      
    }                                                                                                  
    if(low>high) {flag=0;return 0;}
        
                    /*蓝色部分为二分查找法(或称折半查找法)的算法*/                           
    return mid;
    }

    展开全文
  • Oracle 学习笔记 字符集概述 这节课开始讲oracle里面的字符集 偏重于原理和简单的一些判断以及实现 字符集它涉及到很多的东西 比如建库和操作系统环境 这节课把字符集的原理性的东西以及常见的...字符集是编号和字

    Oracle 学习笔记 字符集概述

    这节课开始讲oracle里面的字符集
    偏重于原理和简单的一些判断以及实现

    字符集它涉及到很多的东西
    比如建库和操作系统环境

    这节课把字符集的原理性的东西以及常见的操作讲一下
    大家以后不要在字符集方面犯一些错误
    以后字符集的问题基本都可以解决了

    一)字符集的发展

    通过查找各方面资料
    这里把字符集的发展自己先简单梳理了一下

    字符集是编号和字符的对应表
    是为了让计算机使用和显示出来人们使用的语言和符号
    这个编号就是编码表中的编码
    而字符的表现都是字模的形式
    一个编码对应着一个图形类型的字模
    人们向计算机输入字符,计算机通过编码表把它转变为编码
    这些编码在计算机内部处理或运算
    而需要查看处理过程和结果的时候
    因为有了这种编码就可以从这些编码表中找到对应的字模
    并有系统绘制或显示出来

    计算机控制运算和传输只能使用二进制的1和0
    要输入和显示出的文字和符号都要有一个转变为0、1和由0、1转变来的过程
    这样就需要用二进制来标定它们
    计算机需要使用编码表来完成这个工作

    在地球上
    计算机使用最早的字符集是
    BCD(binary coded decimal)编码表
    只有十个数据
    用二进制表示从0到9十个数字
    只要四位二进制就够了

    这些对计算机是不够的
    因为计算机还要使用字母和控制符

    而恰好计算机最早出现在使用英语的美国

    所以IBM公司(国际商用机器公司)制定了EBCDIC编码
    EBCDIC码(Extended Binary Coded Decimal Interchange Code)
    广义二进制编码的十进制交换码
    对BCD码扩展
    使用八位二进制表示256个包括数字、英文字符、控制符和其它一些常用字符

    这时美国国家标准局(ANSI)也制定了ASCII码
    即美国标准信息交换码(American Standard Code for Information Interchange)
    被国际标准化组织( International Organization for Standardization, ISO )批准为国际标准
    称为ISO 646标准

    基本的 ASCII 字符集,使用了七位二进制,共有 128 个字符,
    其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符

    EBCDIC和ASCII中都主要是英文字母,但在字符的位置和排列顺序上不一样

    在计算机技术发展的早期,如ASCII和EBCDIC这样的字符集逐渐成为标准

    数字0到9使用BCD编码4位的二进制就可以实现
    英文字符、控制符和一些常用的符号用7位二进制的标准ASCII可以完成

    但是世界上的符号包括文字非常的多
    各个国家都要使用计算机
    就需要更多的二进制数来和他们对应

    首先字母文字国家把这种编码表扩充到了8位

    ISO 陆续制定了一批适用于不同地区的扩充 ASCII 字符集
    最低的128个代码总是相同的,较高的128个代码取决于定义内码表的语言

    这多余的128个码位的不同扩展,就形成了一系列ISO-8859-*的标准

    代表性的是实现了西欧语言编码的ISO-8859-1(即Latin-1)
    它向下兼容ASCII,是一种西欧字符集

    像东亚的国家
    每个文字都是一个独立的符号
    用8位只256个空间无法表示
    所以位数被进一步扩展
    使用了16位二进制为自己的国家制定了编码表
    用于显示本国的语言
    不同的国家和地区制定了不同的标准,
    由此产生了 GB2312, BIG5, JIS 等各自的编码标准
    它们使用2个字节来代表一个字符

    每个字符使用一个字节编码,这样的字符集就是单字节字符集SBCS(Single-byte Character Sets)
    每个字符最多使用两个字节编码,这样的字符集就是双字节字符集DBCS(Double-byte Character Sets)
    某些字符的编码超过了一个字节,这样的字符集就是多字节字符集MBCS(Multi-byte Character Sets)

    在中国,中国国家标准委员会开始了设计工作
    保留ASCII的127号以前的编码并把编码扩展到两个字节
    方案中可以组合出大约7000多个中文字符,这就是国标(国家标准GB)2312
    是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称GB0

    GB2312 是对 ASCII 的中文扩展
    由于GB2312只收录6763个汉字,于是微软利用GB 2312未使用的编码空间,制定了GBK编码
    GBK即汉字内码扩展规范
    K为汉语拼音 Kuo Zhan(扩展)中“扩”字的声母
    英文全称Chinese Internal Code Specification
    也使用了双字节编码方案。

    在香港出现了Big5,又称大五码
    是繁体中文(正体中文)最常用字符集标准,共收录13060个汉字

    这些出现的由ASCII扩展而来,用于单种语言的编码表又被微软使用为ANSI编码
    在简体中文系统下,ANSI 编码代表 GB2312 编码,
    在日文操作系统下,ANSI 编码代表 JIS 编码
    它们既兼容ASCII又互相不兼容

    这时世界已形成出了多种的字符编码体系
    包括分别以ASCII和EBCDIC为基础并且由它们扩展而来的编码体系
    还有SAP(systems applications and products in data processing)体系等
    SAP在德国,是全球企业管理软件与解决方案的技术领袖,同时也是市场领导者
    SAP既是公司名称,又是其产品企业管理解决方案的软件名称

    每种编码体系都有各种文字的很多的编码表
    但是各自的编码不同,适用于不同的环境
    EBCDIC编码体系主要由IBM生产的机器使用,
    如IBM的大型机S/390、zSeries及其上的操作系统IBMOS/390、z/OS
    和IBM的中小型机AS/400、IBM i系列及其上的操作系统OS/400、i5/OS
    IBM的个人计算机和工作站操作系统使用的是文本的工业标准编码ASCII码
    如:AIX(Advanced Interactive eXecutive)IBM开发的一套UNIX操作系统
    它的平台的字符编码是基于 ASCII 的

    一般地说,开放的操作系统(LINUX 、WINDOWS等)采用ASCII 编码,
    而大型主机系统(MVS 、OS/390)等采用EBCDIC 编码。
    绝大多数所熟悉的系统都是使用ASCII

    在每个体系中还存在一个问题
    各个语言的编码表自己独立使用是可以的
    如果放在一起使用会发生同一编码对应不同文字的冲突问题

    为了解决这个问题
    一个软件制造商的协会unicode组织和国际标准化组织(ISO)
    都进行了把世界上所有的字符放在一起进行统一编码的工作
    ISO开发了ISO 10646项目,Unicode协会开发了Unicode项目

    Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案
    而Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容)

    “ Universal Multiple-Octet Coded Character Set”,简称UCS
    是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的标准字符集

    当双方认识到世界不需要两个不兼容的字符集
    它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作

    从Unicode 2.0开始,Unicode采用了与ISO 10646-1相同的字库和字码
    ISO也承诺使两方保持一致
    目前两个项目仍都存在,并独立地公布各自的标准。

    UCS编码有自己的格式:UCS-2和UCS-4等等
    在编码层面上
    UCS-2就是用两个字节编码
    UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。

    unicode在编码上和UCS保持一致,在实现上有自己的规则,而UCS只定义了编码标准。

    unicode的实现形式上有UTF-8,UTF-16,UTF-32,还有UTF-7等。
    UTF是“UCS Transformation Format”的缩写
    都是将数字转换到程序数据的编码方案。

    UTF-16是UCS-2的扩展,UTF-32是UCS-4的子集。

    一般对于UNICODE来说,UCS-2是内码,而UTF-8等则是它的实现方式

    中国为了和ISO 10646编码接轨制定了国家标准GB13000
    等同于国际标准的《通用多八位编码字符集 (UCS)》 ISO10646.1
    就是等同于Unicode的标准,代码页等等的都使用UTF的一套标准
    一共使用四个字节
    目前所有字符代码的前两个字节都是0
    因此默认情况下按照两字节处理

    而GBK并非国家正式标准
    仅是GB 2312到GB 13000.1-93之间的过渡方案

    但GB13000标准目前发展缓慢

    GB 18030全称:国家标准GB 18030-2005《信息技术中文编码字符集》
    是中华人民共和国现时最新的内码字集
    GB 18030与GB 2312-1980完全兼容,与GBK基本兼容,支持GB 13000及Unicode的全部统一汉字,
    共收录汉字70244个
    与 UTF-8 相同,采用多字节编码,每个字可以由1个、2个或4个字节组成

    GB18030是我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准,
    是未来我国计算机系统必须遵循的基础性标准之一

    在windows中这些编码表被称为代码页,也称为“内码表”

    早期,代码页是IBM称呼计算机的BIOS所支持的字符集编码
    操作系统直接使用BIOS提供的字符绘制功能来显示字符(或者是一组嵌入在显卡字符生成器中的字形)
    操作系统的编码支持也就依靠BIOS的编码
    这时的代码页被集成在硬件中,由制造商选择集成哪种代码页,称作OEM(原始设备制造商)代码页
    最具代表性的是”IBM PC或MS-DOS 代码页437”。

    随着图形用户界面操作系统的广泛使用,操作系统本身具有了字符绘制的功能
    Windows代码页最初是根据ANSI草案实现的
    微软在Windows操作系统没有转向UTF-16作为内码实现之前(也就是在Windows 2000之前),
    针对不同的使用地区与国家,定义了一系列的支持不同语言字符集的代码页,
    被称作”Windows(或ANSI)代码页”。
    这是Windows代码页被称作ANSI的缘由。
    ANSI由ASCII标准编码扩展而来,它们既兼容ASCII又互相不兼容

    ANSI code pages实际上是一系列的编码集合,
    是微软自己定义的代码页
    根据操作系统区域设置而激活其中一种作为ANSI编码由系统默认使用。
    在保存文件时编码选择ANSI就是选择这个默认的编码。
    公司电脑(英文系统)上的ANSI code page可能是1252,而家里的中文系统则可能是936
    在简体中文操作系统中ANSI编码默认指的是GB系列编码(GB2312、GBK);
    在繁体中文操作系统中ANSI编码默认指的是BIG5;
    在日文操作系统中ANSI编码默认指的是Shift JIS

    ANSI编码是在Windows中特别是在windows安装过程中可以指定为默认代码页
    为了使windows系统本地化而选择的一种本地语言编码表
    由于世界上有很多的语种,
    每种语言的ANSI编码指的都是这种语言对应的编码表,国家不同代码页也不同
    在windows中同时只能选择一种代码页作为ANSI编码使用

    ANSI代码页的特点:
    编码0至127符合ANSI制定的ASCII编码标准
    是由微软制定并实现的
    编码最多两个字节

    ANSI使用最明显的例子:
    widows中保存文本文件一般
    里面有四个选项:ANSI,Unicode,Unicode big endian 和 UTF-8

    (1)ANSI是默认的编码方式。
    对于英文文件是ASCII编码,对于简体中文文件是GB2312编码
    (只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。
    (2)Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。
    这个选项用的little endian格式。
    (3)Unicode big endian编码与上一个选项相对应。
    (4)UTF-8编码
    它们就是windows系统正在使用的字符集
    第一个选项就是使用的系统默认的ANSI代码页

    在windows中的代码页是微软系统使用的当然要由微软指定
    对于ANSI编码微软往往都是先得到相应国家自己制定的标准
    然后微软对其进行修改或扩充得到自己的代码页

    如繁体中文的BIG5编码,日本的Shift JIS编码,西欧iso-8859-1
    微软以原编码为基础
    对其修改扩充后分别得到的代码页编号为950,932,1252

    简体中文GBK码
    是微软在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案
    完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,
    并包含了BIG5编码中的所有汉字
    GBK对应代码页936

    Windows平台上的GUI程序使用ANSI代码页,
    而控制台程序Windows 中的字符模式的应用程序(使用命令提示符窗口的应用程序)
    使用过去在 DOS 中使用的代码页。
    由于历史原因,这些代码页称为 OEM(原始设备制造商)代码页
    这两种代码页在前128个字符的编码是一样的,
    但后128个字符的编码可能不一致。
    而现在图形系统中提供的OEM代码页只是为了和早期使用OEM代码页的程序兼容

    字符要在系统中绘制
    还需要字符编码表对应的字模库,也称字形库
    计算机最早使用的是点阵字体字模,
    到现在有了很多的矢量字体字模,又称轮廓字体、描边字体,
    TrueType字体与PostScript字体、OpenType字体是主要的三种

    点阵字体也叫位图字体,其中每个字形都以一组二维像素信息表示
    矢量字库保存的是对每一个字的描述信息
    比较而言点阵字体优点是显示速度快,最大的缺点是不能放大
    现在点阵字体仍在被广泛的使用

    Windows使用的字库也为以上两类,
    在FONTS目录下,如果字体扩展名为FON,表示该文件为点阵字库,扩展名为TTF则表示矢量字库

    下面简单的列一下windows中几个代码页和字符集的对应关系

    分三列,分别表示
    代码页编号、对应编码名称、说明
    37 IBM037 IBM EBCDIC (US-Canada) 就是最早的EBCDIC编码表
    437 IBM437 OEM United States 美国扩展ASCII表,最初的IBM PC代碼頁,实现了扩展ASCII字符集
    20127 us-ascii US-ASCII 就是基础的7位ASCII编码

    65000 utf-7 Unicode (UTF-7)
    65001 utf-8 Unicode (UTF-8)
    65005 utf-32LE Unicode (UTF-32)
    65006 utf-32BE Unicode (UTF-32 Big-Endian)

    1200 UTF-16LE Unicode(UCS-2LE Unicode) (little-endian小端序)
    1201 UTF-16BE Unicode(UCS-2BE Unicode) (big-endian大端序)

    20936 GB2312 简体中文(GB2312)
    936 GBK 简体中文(GBK)
    54936 GB18030 简体中文(GB18030)
    950 BIG5 繁體中文(大五碼)
    932 Shift_JIS 日文(Shift_JIS)
    949 EUC-KR 韓文(EUC-KR)

    28591 iso-8859-1 西欧字符 (ISO)Latin-1 西歐拉丁字母
    28605 iso-8859-15 Latin 9 (ISO) 西欧语言
    1252 Windows-1252 西欧字符(Windows)

    有个别情况要说明:

    Windows 1252和ISO 8859-1基本等同但并不完全一致,
    ISO-8859-1在0x80-0x9F范围的控制字符,在Windows-1252中被可打印字符取代。
    由于在web网页中,ASCII控制字符不起作用,
    所以网页一般用Windows-1252代码页标记替代ISO-8859-1标记。

    iso-8859-15 Latin 9 字符集是iso-8859-1 Latin 1字符集的更新版本,
    去掉一些不常用的字符,增加修正了部分字符,增加了欧元字符

    每种编码集在不同的编码体系中有不同的别名

    如iso-8859-1编码:
    ISO-8859-1编码也是单字节编码,最多能够表示256个字符。
    Latin1是ISO-8859-1的别名,有些环境下写作Latin-1
    在OEM(IBM PC)代码页编号是 850 —“多语言(Latin-1)” (西欧语言)
    IBM中叫它Code page 819 or CP819
    Oracle中则是WE8ISO8859P1编码或WE8MSWIN1252编码
    SAP中是SAP Code page 1100
    在windows中被使用为28591和1252代码页

    又如UTF-8:
    UTF-8在IBM称作代码页1208,在微软称作代码页65001,在SAP称作代码页4110

    在oracle中对编码的命名有一定的规则
    如:

    AL32UTF8

    【AL】支持所有语言(All Language)。

    【32】每字符最多占用32位(4字节)。

    【UTF8】编码为UTF-8。

    WE8MSWIN1252

    【WE】支持西欧语言(Western Europe)。

    【8】每字符需要占用8位(单字节)。

    【MSWIN1252】编码为CP1252。

    US7ASCII

    【US】表示美国(United States)。

    【7】每字符需要占用7位。

    【ASCII】编码为ASCII。

    其它如ZHS16GBK,ZHT16BIG5,US8PC437(编码为OEM cp437),都可以类推

    二)字符集概念

    继续讲课课程

    首先看一下
    oracle的字符集,什么叫字符集

    字符集说白了是一个集合
    是一张表,这个表有两列

    左面这列是字符是所有要存储的字符

    字符有很多字符
    比如我们讲中文字符
    左面这列就是中国人常用的所有的中文字符
    有汉字、英文字母有数字还有一些特殊的符号
    在左面都出现是我们中文要使用的所有的字符
    右边是一个编码,从1号2、3、4、5、6
    将来提到1的时候就对应着一个字符

    所以说字符集就是字符和编码的这么一个对应表

    我们知道在计算机里面只能存储数字
    我们不能存储一个字符,存储不了字符

    但是我们还想在计算机里面存储字符
    我们就做了一件事情
    将字符对应成编码存储起来

    比如我要存中文
    中文里面的“中国”这两个字符
    我们就找这个字符集
    “中”和“国”分别对应着两个编码
    把两个编码存储到数据库里面去
    这是存储的时候

    显示的时候
    根据两个编码再来查
    显示的是”中”和”国”
    把两个字符显示出来
    这就是我们计算机里面的字符集的概念

    在计算机里面很多地方都有字符集的概念
    我们的oracle数据库也有字符集的概念

    因为oracle要存字符
    有字符就需要字符集的概念

    三)有字符集的地方

    简单讲一下哪些地方有字符集

    1)操作系统

    第一个操作系统有字符集
    比如我们的windows有字符集
    linux也有字符集,unix也有字符集
    操作系统os本身有字符集

    比如我们的linux字符集我们可以看一下
    使用locale命令

    [oracle@redhat4 ~]$ locale
    LANG=zh_CN.UTF-8
    LC_CTYPE="zh_CN.UTF-8"
    LC_NUMERIC="zh_CN.UTF-8"
    LC_TIME="zh_CN.UTF-8"
    LC_COLLATE="zh_CN.UTF-8"
    LC_MONETARY="zh_CN.UTF-8"
    LC_MESSAGES="zh_CN.UTF-8"
    LC_PAPER="zh_CN.UTF-8"
    LC_NAME="zh_CN.UTF-8"
    LC_ADDRESS="zh_CN.UTF-8"
    LC_TELEPHONE="zh_CN.UTF-8"
    LC_MEASUREMENT="zh_CN.UTF-8"
    LC_IDENTIFICATION="zh_CN.UTF-8"
    LC_ALL=

    这个命令结果中
    当前的字符集是UTF-8

    还有locale 加上 -a 参数

    [oracle@redhat4 ~]$ locale -a
    aa_DJ
    aa_DJ.iso88591
    aa_DJ.utf8
    aa_ER
    aa_ER@saaho
    aa_ER.utf8
    aa_ER.utf8@saaho
    aa_ET
    aa_ET.utf8
    .
    .
    .
    zh_CN
    zh_CN.gb18030
    zh_CN.gb2312
    zh_CN.gbk
    zh_CN.utf8
    zh_HK
    zh_HK.big5hkscs
    zh_HK.utf8
    zh_SG
    zh_SG.gb2312
    zh_SG.gbk
    zh_SG.utf8
    zh_TW
    zh_TW.big5
    zh_TW.euctw
    zh_TW.utf8
    zu_ZA
    zu_ZA.iso88591
    zu_ZA.utf8

    结果内容较多只列出一部分
    可以展示出linux支持的所有的字符集

    还支持zh_HK.big5hkscs
    大5码,香港人用的

    还支持zh_SG.gbk
    我们的国标

    还支持zh_TW.utf8
    UNICODE类字符集

    这里有它支持的所有字符集

    在windows里面支持的当前的字符集

    先打开 windows 的 命令提示符
    有一个chcp命令

    C:\WINDOWS>chcp
    活动的代码页: 936

    活动代码页是936
    936是中文字符集

    这是我们操作系统有字符集

    2)oracle数据库

    oracle数据库本身有字符集
    数据库软件里面带着字符集

    它也带着很多张表
    一个表是一种字符集

    字符集可以认为是一张表
    是一张字符和编码的对应表

    oracle有字符集说明oracle有这张表

    oracle支持很多种字符集说明oracle里面有很多种这张表

    操作系统有字符集也有这张表

    3)软件

    还有一些软件跟oracle一样
    本身也带字符集

    有些软件本身是不带字符集的
    有些软件有字符集

    oracle或者一些别的软件有字符集
    他就自己使用自己的
    有些软件不带字符集的字符集
    他就使用操作系统字符集

    要注意这个地方
    看看软件本身有没有字符集

    后面还会通过例子去强调

    字符集就是字符和编码的这么一张对应表
    操作系统和oracle都有字符集的概念

    四)什么时候用字符集

    我们访问一个表
    访问t2这张表

    先把t2中的数据都删了

    SQL> delete from t2;
    
    1 row deleted.
    
    SQL> commit;
    
    Commit complete.

    先查一下

    SQL> select * from t2;
    
    no rows selected

    没有数据

    SQL> desc t2;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     ID                                                 NUMBER
     NAME                                               VARCHAR2(20)

    t2这张表有两个列
    一个是ID列 类型是NUMBER 数字列
    NAME列 是VARCHAR2列 VARCHAR是字符

    所以说对这个表来讲
    表t2有两列
    有id列类型是number
    name列类型是varchar

    对id列来讲,因为它是数字列,没有字符的概念
    对这个列来讲不用字符集

    往这个列中插入数据和删除数据、显示数据的时候
    它不涉及到字符的概念字符集的概念

    但是name列 类型是varchar 或varchar2
    因为这个列存储的是字符

    往这个列中插入删除还有显示数据的时候
    这个列要用到字符集的概念
    如果一个数据库里面没有varchar
    只有类似于number这样的这种列
    这个数据库可以没有字符集的概念

    但大家想想没有可能,不可能
    所有的数据库里面的表总有varchar
    而且还以varchar为主

    什么时候使用字符集呢

    (1)当我们用来存储CHAR, VARCHAR2, CLOB, LONG等类型数据的时候

    这四种类型都是放字符的
    char是固定长度放字符的
    varchar是可变长度放字符的
    clob是大对象,比如我们把一片文章存进去
    long也是大对象,但它现在像是慢慢被clob取代了

    当我们的列是这四种列的时候
    往这四种列存数据的时候用到字符集

    当然了还有数据字典里面
    (2)用来标示诸如表名、列名以及PL/SQL变量等
    (3)用来存储SQL和PL/SQL程序单元等

    数据字典里面的一些char和varchar,clob和long也要用到数据库字符集

    五)国家字符集

    还有一种用到的字符集

    我们在oracle安装的时候
    有两个字符集
    一个是数据库字符集
    一个是国家字符集

    看一下我们oracle安装过程的时候
    在其中安装的一步的时候
    在调sga、pga里面
    我们还可以看到有字符集的选择
    我们有两种字符集
    第一是数据库字符集,我们选择了
    第二是国家字符集,我们也选择了

    这两个字符集含义
    是分别应用在不同场合

    当我们建立一个表
    这个表如果它的列的类型是char varchar clob long
    这个时候oracle就使用数据库字符集

    如果我们建了一个表
    它的数据类型是 nchar nvarchar2 或nclob
    这个时候针对这个表我们就使用国家字符集

    现在表t2它的有个列是varchar
    我往t2插入数据和显示数据的时候
    它会用到数据库字符集

    再建立一个表t3

    SQL> create table t3(id number,name nvarchar2(20));
    
    Table created.

    这是建了一个表

    SQL> desc t3;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     ID                                                 NUMBER
     NAME                                               NVARCHAR2(20)

    这个时候针对表t3它的列是nvarchar

    对表t3来讲
    我要能往里面存储数据和显示数据的时候
    用到国家字符集

    向t3表中插入数据

    SQL> insert into t3 values(1,'中国');
    
    1 row created.

    查看使用的字符集

    SQL> select id,name,dump(name,1016) from t3;
    
            ID NAME   DUMP(NAME,1016)
    ---------- ------ --------------------------------------------------
             1 中国   Typ=1 Len=4 CharacterSet=AL16UTF16: 4e,2d,56,fd

    可以看出CharacterSet=AL16UTF16
    这里说明是使用的国家字符集

    一个表中同时存在varchar和nvarchar时
    就是即使用数据库字符集又使用国家字符集时
    国家字符集的设置只对nvarchar的列起作用

    新建一个表t4,包含varchar列和nvarchar列

    SQL> create table t4(id number,name varchar(20),namen nvarchar2(20));
    
    Table created.
    
    SQL> desc t4;
     Name    Null?    Type
     ------- -------- --------------------------------------------------------
     ID                NUMBER
     NAME              VARCHAR2(20)
     NAMEN             NVARCHAR2(20)

    向t4中插入数据

    SQL> insert into t4 values(1,'中国','中国');
    
    1 row created.

    查看数据的编码

    SQL> select id,name,dump(name,1016),namen,dump(namen,1016) from t4;
    
            ID NAME   DUMP(NAME,1016)                                    NAMEN  DUMP(NAMEN,1016)
    ---------- ------ -------------------------------------------------- ------ --------------------------------------------------
             1 中国   Typ=1 Len=4 CharacterSet=ZHS16GBK: d6,d0,b9,fa     中国   Typ=1 Len=4 CharacterSet=AL16UTF16: 4e,2d,56,fd

    可以看出varchar列使用的数据库字符集ZHS16GBK
    而nvarchar列使用的是国家字符集AL16UTF16

    所以国家字符集不是作用于整个表
    而是作用于使用它的列

    六)数据库字符集状况

    我们可以查一下数据库用到字符集的状况

    SQL> select * from nls_database_parameters;
    
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_LANGUAGE                   AMERICAN
    NLS_TERRITORY                  AMERICA
    NLS_CURRENCY                   $
    NLS_ISO_CURRENCY               AMERICA
    NLS_NUMERIC_CHARACTERS         .,
    NLS_CHARACTERSET               ZHS16GBK
    NLS_CALENDAR                   GREGORIAN
    NLS_DATE_FORMAT                DD-MON-RR
    NLS_DATE_LANGUAGE              AMERICAN
    NLS_SORT                       BINARY
    NLS_TIME_FORMAT                HH.MI.SSXFF AM
    NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
    NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
    NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
    NLS_DUAL_CURRENCY              $
    NLS_COMP                       BINARY
    NLS_LENGTH_SEMANTICS           BYTE
    NLS_NCHAR_CONV_EXCP            FALSE
    NLS_NCHAR_CHARACTERSET         AL16UTF16
    NLS_RDBMS_VERSION              10.2.0.1.0
    
    20 rows selected.

    数据库的字符集
    NLS_CHARACTERSET ZHS16GBK
    是中文字符集
    目前数据库的字符集是中文字符集

    国家字符集是
    NLS_NCHAR_CHARACTERSET AL16UTF16

    数据库里面是两个字符集
    第一叫数据库字符集
    第二叫国家字符集

    当前数据库系统使用环境
    数据库字符集是中文字符集
    国家字符集是AL16UTF16

    通过
    select * from nls_database_parameters;
    这个sql语句可以查出来

    一般来讲国家字符集用的比较少
    一般都是使用数据库字符集
    国家字符集往往作为数据库字符集的一个补充
    它们应用场合不同

    七)常用字符集

    讲到这个地方我们看一下字符集的命名

    比如对oracle数据库来讲
    有几个经典的字符集

    经常关注
    US7ASCII
    ZHS16CGB231280
    AL32UTF8
    AF16UTF16
    ZHS16GBK
    utf8
    这几个字符集

    我们关注字符集的时候其实就关注一个地方
    这个字符集能存储哪些字符

    比如这个US7ASCII码
    这是美国人使用的字符集
    它只能存储美国人的使用的字符
    美国人存储使用的字符不超过128个

    我们学计算机的时候
    学ascii码都知道
    我们的ascii码一共使用一个字节8个位来表示
    对美国人来讲它只使用右边的7位,最高位是0
    所以说它只使用7位

    只能存储常见的26个英文字母数字
    以及加减乘除等字符
    不超过128个
    这是美国人用的字符集US7ASCII

    zhs16cgb231280是中国人用的字符集
    里面可以存中文
    这是我们的中文的国标
    这个字符集比较老
    里面并没有存储所有的中文字符集,相对少一些

    最新的中文字符集是ZHS16GBK
    我们都用这个最新的中文字符集

    zhs16cgb231280这个字符集所容纳的所有的字符
    ZHS16GBK都有
    也就是说ZHS16GBK是zhs16cgb231280的超集

    超集不意味着严格超集

    所谓的超集就是
    zhs16cgb231280里面有的字符
    ZHS16GBK里面都有是超集

    严格超集是
    zhs16cgb231280里面有的字符
    ZHS16GBK里面都有
    而且zhs16cgb231280里面字符对应的编码
    和ZHS16GBK里面对应的编码是一样的
    这就是严格超集

    比如说zhs16cgb231280和ZHS16GBK是超集的关系
    但不是严格超集的关系

    比如“中国”两个字
    在zhs16cgb231280有,在ZHS16GBK里面也有
    但是在zhs16cgb231280里面的编码
    和在ZHS16GBK里面的编码是不一样的
    所以只能说是超集不能说是严格超集

    这是中文

    还有一个utf8字符集
    叫unicode字符集

    zhs16cgb231280和ZHS16GBK这两个里面存的是中国人常用的字符
    US7ASCII存的是美国人常用的字符

    比如说“中石油”,这是个跨国企业
    有一张表专门存储员工的姓名的
    对中石油来讲
    它既有中国人也有韩国人也有日本人也有津巴布韦非洲人
    有很多员工
    这些员工的名字是有各个国家的名字
    它们有自己的语言

    所以说这个表里面现在有一个需求

    数据库里面
    有张表,有列
    有一个列是varchar将来可以存字符
    存字符要用到数据库字符集

    这里面将来要存储的
    第一存储中文,第二英文,第三日文,第四韩语
    要存储很多字符集字符

    要用中文字符集不行
    英文字符集不行
    日文韩文都不行
    针对日文韩文都有相关的字符集都不行

    这个时候针对这个问题
    有一些比较大的公司它们统一起来做了一张字符集
    叫unicode字符集
    当时它设计的初衷是
    将全世界所有的字符以及对应的编码编成一个字符集

    unicode字符集也是字符集
    左面是字符右面是编码

    只不过它左边的字符不仅仅局限于中文英文
    它的初衷是把全世界所有的字符全部编到这个编码里面去
    然后给它统一性编码
    也就是说如果说数据库是unicode字符集的话
    也就意味着它可以存储全世界所有的字符

    所以一开始推出了一个utf8,u开头的字符集

    因为当时基于技术以及各个方面的限制
    这个utf8它的初衷是存储全部的字符
    但是并没有做到
    只是存储了部分字符集
    但是里面有中英文日文都有
    只不过没有那么全而已

    utf8是一个比较老的unicode字符集

    最后随着技术的改进
    又推出了AL32UTF8这个最新的字符集
    这个字符集比utf8字符就多的多了
    它含的字符集范围就非常广了

    所以说要用unicode字符集的话那就用AL32UTF8

    对国家字符集来讲我们统一的选AF16UTF16
    这个字符集也是unicode字符集

    unicode字符集有三个
    AL32UTF8
    AF16UTF16
    utf8

    对数据库字符集来讲,我们通常选择AL32UTF8
    对国家字符集来讲,我们选择AF16UTF16

    因为AL32UTF8是unicode最新字符集
    AF16UTF16是数据库国家字符集

    八)存储中文的选择

    如果一个数据库里面我们将来要存中文
    有几种选择

    对国家字符集来讲
    我们只选择AF16UTF16没有别的选择

    对数据库字符集来讲
    如果我将来要存中文有两种办法

    第一种办法
    我们将数据库字符集设成AL32UTF8
    将来存中文肯定没问题

    第二个办法
    做成ZHS16GBK

    如果确认数据库里面将来只存中文当然里面也包括英文
    只存中英文
    也就是说只是中国人使用
    最好把它设成ZHS16GBK

    AL32UTF8它里面是可以存中文
    但是每一个中文所对应的字符编码会消耗更多的空间
    也就是说AL32UTF8它全,但是在性能上会差一些
    考虑到性能我们最好用ZHS16GBK

    如果存中文,如果只存中文那就是ZHS16GBK

    如果你是国际化、国际型的企业那就是UTF8

    选择AL32UTF8的话在很多地方会涉及到字符编码的转换
    以及占用过多的空间
    占用过多的空间就意味着
    将来io啊网络啊等等会有更大的负载

    这就是数据库字符集该如何选择

    US7ASCII中的US表示语言存的是英语
    7是也就是将来编码是用7位
    ASCII是编码

    对我们中国人来讲
    将来用ZHS16GBK用16位,GBK表示国标,
    是使用我们中国人,我们的中文国标来进行编码

    九)有多少字符集可以选择

    我们到底有多少字符集可以选择
    可以使用
    select * from V$NLS_VALID_VALUES;
    看一下

    SQL> select * from V$NLS_VALID_VALUES;
    
    PARAMETER       VALUE                     ISDEP
    --------------- ------------------------- -----
    LANGUAGE        AMERICAN                  FALSE
    LANGUAGE        GERMAN                    FALSE
    LANGUAGE        FRENCH                    FALSE
    LANGUAGE        CANADIAN FRENCH           FALSE
    .
    .
    .                 
    LANGUAGE        THAI                      FALSE
    LANGUAGE        JAPANESE                  FALSE
    LANGUAGE        KOREAN                    FALSE
    LANGUAGE        SIMPLIFIED CHINESE        FALSE
    LANGUAGE        TRADITIONAL CHINESE       FALSE
    LANGUAGE        ENGLISH                   FALSE
    .
    .
    .
    TERRITORY       AMERICA                   FALSE
    TERRITORY       UNITED KINGDOM            FALSE
    .
    .
    .                 
    TERRITORY       UNITED ARAB EMIRATES      FALSE
    TERRITORY       THAILAND                  FALSE
    TERRITORY       CHINA                     FALSE
    TERRITORY       HONG KONG                 FALSE
    TERRITORY       JAPAN                     FALSE
    TERRITORY       KOREA                     FALSE
    TERRITORY       TAIWAN                    FALSE
    .
    .
    .            FALSE
    CHARACTERSET    US7ASCII                  FALSE
    CHARACTERSET    WE8DEC                    FALSE
    .
    .
    .            
    CHARACTERSET    WE8PC858                  FALSE
    CHARACTERSET    WE8ISO8859P1              FALSE
    CHARACTERSET    EE8ISO8859P2              FALSE
    CHARACTERSET    SE8ISO8859P3              FALSE
    CHARACTERSET    NEE8ISO8859P4             FALSE
    CHARACTERSET    CL8ISO8859P5              FALSE
    CHARACTERSET    AR8ISO8859P6              FALSE
    CHARACTERSET    EL8ISO8859P7              FALSE
    CHARACTERSET    IW8ISO8859P8              FALSE
    CHARACTERSET    WE8ISO8859P9              FALSE
    CHARACTERSET    NE8ISO8859P10             FALSE
    .
    .
    .            
    CHARACTERSET    IW8MSWIN1255              FALSE
    CHARACTERSET    LT8MSWIN921               FALSE
    CHARACTERSET    TR8MSWIN1254              FALSE
    CHARACTERSET    WE8MSWIN1252              FALSE
    .
    .
    . 
    CHARACTERSET    JA16VMS                   FALSE
    CHARACTERSET    JA16EUC                   FALSE
    CHARACTERSET    JA16EUCYEN                FALSE
    CHARACTERSET    JA16SJIS                  FALSE
    CHARACTERSET    JA16DBCS                  FALSE
    CHARACTERSET    JA16SJISYEN               FALSE
    CHARACTERSET    JA16EBCDIC930             FALSE
    CHARACTERSET    JA16MACSJIS               FALSE
    CHARACTERSET    JA16EUCTILDE              FALSE
    CHARACTERSET    JA16SJISTILDE             FALSE
    CHARACTERSET    KO16KSC5601               FALSE
    CHARACTERSET    KO16DBCS                  FALSE
    CHARACTERSET    KO16KSCCS                 FALSE
    CHARACTERSET    KO16MSWIN949              FALSE            
    CHARACTERSET    ZHS16CGB231280            FALSE
    CHARACTERSET    ZHS16MACCGB231280         FALSE
    CHARACTERSET    ZHS16GBK                  FALSE
    CHARACTERSET    ZHS16DBCS                 FALSE
    CHARACTERSET    ZHS32GB18030              FALSE
    CHARACTERSET    ZHT32EUC                  FALSE
    CHARACTERSET    ZHT32SOPS                 FALSE
    CHARACTERSET    ZHT16DBT                  FALSE
    CHARACTERSET    ZHT32TRIS                 FALSE
    CHARACTERSET    ZHT16DBCS                 FALSE
    CHARACTERSET    ZHT16BIG5                 FALSE
    CHARACTERSET    ZHT16CCDC                 FALSE
    CHARACTERSET    ZHT16MSWIN950             FALSE
    CHARACTERSET    ZHT16HKSCS                FALSE
    CHARACTERSET    AL24UTFFSS                TRUE
    CHARACTERSET    UTF8                      FALSE
    CHARACTERSET    UTFE                      FALSE
    CHARACTERSET    AL32UTF8                  FALSE
    CHARACTERSET    ZHT16HKSCS31              FALSE
    CHARACTERSET    JA16EUCFIXED              TRUE
    CHARACTERSET    JA16SJISFIXED             TRUE
    CHARACTERSET    JA16DBCSFIXED             TRUE
    CHARACTERSET    KO16KSC5601FIXED          TRUE
    CHARACTERSET    KO16DBCSFIXED             TRUE
    CHARACTERSET    ZHS16CGB231280FIXED       TRUE
    CHARACTERSET    ZHS16GBKFIXED             TRUE
    CHARACTERSET    ZHS16DBCSFIXED            TRUE
    CHARACTERSET    ZHT32EUCFIXED             TRUE
    CHARACTERSET    ZHT32TRISFIXED            TRUE
    CHARACTERSET    ZHT16DBCSFIXED            TRUE
    CHARACTERSET    ZHT16BIG5FIXED            TRUE
    CHARACTERSET    AL16UTF16                 FALSE
    .
    .
    .
    SORT            TCHINESE_RADICAL_M        FALSE
    SORT            BIG5                      FALSE
    SORT            HKSCS                     FALSE
    SORT            TCHINESE_STROKE_M         FALSE
    SORT            SCHINESE_PINYIN_M         FALSE
    SORT            SCHINESE_STROKE_M         FALSE
    SORT            GBK                       FALSE
    SORT            SCHINESE_RADICAL_M        FALSE
    SORT            JAPANESE_M                FALSE
    SORT            KOREAN_M                  FALSE
    
    494 rows selected.

    返回内容较多只截取了部分显示

    第一列是LANGUAGE的部分
    如:
    LANGUAGE AMERICAN FALSE
    这是字符集关于语言的设置

    第一列是CHARACTERSET
    如:
    CHARACTERSET US7ASCII FALSE
    是关于字符集的设计

    结果中有非常多的字符集可以设置
    全部都可以设

    有oracle支持的所有的字符集

    有CHARACTERSET AL16UTF16 FALSE
    字符集
    是最后面的一个字符集

    还有
    CHARACTERSET AL32UTF8 FALSE
    这个字符集unicode字符集

    中文字符集可以去找一下

    CHARACTERSET ZHS16GBK FALSE
    是中文字符集

    还有一些日文字符集
    如:
    CHARACTERSET JA16SJISTILDE FALSE

    除了我们中英文以外
    还有一些字符集
    以后做数据库的时候经常会碰到
    就是我们的繁体

    繁体字符集里面又分台湾的和香港的
    香港的都用大5码

    因为现在的我们的台湾企业和香港企业很多
    所以说你将来毕业以后如果去香港企业的话
    你会发现它的字符集很多用大5码
    大5码是繁体中文
    存简体中文的时候可能有问题

    在返回结果中的第三列是ISDEPRECATED
    中文翻译是:是否被启用
    就是因为版本升级的原因,有些参数可能在新版本中已不再被使用
    如果当前还被使用这个值是FALSE
    如果当前版本已经不使用这个参数了,这个值就是true

    记住这里有一个视图可以去查

    这里讲了数据库字符集的一些常见的一些知识
    以及常见字符集一些基础的知识
    并讲了相关的视图
    同时讲了哪些字符集可以设置

    字符集的概论先简单讲到这个地方
    下节课讲一下
    在一个复杂的环境里面我们该如何去设置字符集
    以及出了字符集以后如何去判断

    十)操作系统

    字符集是操作系统处理信息的一个很重要的方面
    操作系统到底是什么这里也简单的说一下

    人们在运行各种软件时
    基本都不是在硬件上直接运行
    而是在操作系统上运行

    它给了一个操作计算机的环境
    使硬件合理正确的工作
    给软件提供运行的环境

    一个好的操作系统
    可以全面的控制硬件
    并使硬件完成各种各样的功能
    不用每个软件再去编码完成同样的事情

    它本身和软件和硬件都有紧密的结合

    以硬件和集成在硬件上的更基础的软件为基础如各种bios
    给程序提供各种运行的需求

    bios为基本输入输出系统,为计算机中最基础的系统
    它集成在硬件中并最直接的和硬件接触

    计算机启动需要先启动硬件
    从主机加电开始
    然后检查各个硬件,使硬件的bios运行

    而操作系统一般在硬盘中
    接着主板上的bios找到硬盘上的操作系统

    如果一切正常操作系统就开始运行,启动成功了

    计算机和操作系统历史都很悠久
    已经有很多的成功产品
    每类产品都包含了很多的内容

    一般的操作系统都是针对某一类硬件制作的
    在提供给某一类软件运行环境时
    也给软件在其上运行产生了无法避免的限制

    一种系统产生的目的大多是给某类的软件提供运行环境
    同时也决定了它的使用群也是固定的
    大型企业要使用服务器而一般家庭使用pc机就可以了

    操作系统也通过编写代码实现
    任何人代码编写都有自己的目的也都是想实现自己的目的

    在人们印象中计算机最大的特点是它的自动化的执行方法
    程序代码可以一行行的自动运行
    功能的运行也以这种自动为主
    但是关键的操作部分还是需要人的操控
    这种关键的控制部分操作系统控制了最关键的部分

    程序完成的自动功能是有范围的
    不可能完成一些人们想象中的很多种的自动功能
    尽管理论上是可以实现的,但很多只是个幻想
    因为计算机作为一种人类的产品能够做的工作也是有限的

    系统的发展是一个不断修改和完善的过程

    现在的操作系统都已包含了非常多的内容并形成了体系
    对硬件的使用趋于完善

    对原系统修改形成新的系统
    人们的愿望是使其进步

    修改原系统就要自己编写代码和修改别人的代码
    自己编写代码都有自己的目的
    修改别人的代码也会同时修改了别人的意图

    这种修改在事实上产生了两种后果

    系统有些方面好用了 和 系统有些方面产生了新的限制

    对软件也产生了两个方面的作用
    软件更好用了和破坏了软件原来的运行环境

    这是因为要进行修改
    就要使原系统使用自己选择的技术

    必然要修改或舍弃一部分原有内容
    就会影响到整个系统的稳定和软件对它使用的要求
    虽然有可能得到好的结果
    但是这么庞大的代码中
    坏的影响也同样的不可避免

    如果你的技术做到了只对原有系统有好的改进
    那绝对是一个好的技术
    但是这是很难做到的
    每个成熟系统都已经经过了很多的这样的进步
    一个不全面了解原代码的程序员
    是很难得到这样的结果的

    计算机硬件的改变在计算机发展过程中非常常见
    所有的系统都是根据硬件编写的,并只适用于特定的硬件
    如果原有计算机使用的硬件基础改变了
    对操作系统的影响将是巨大的
    因为它在整个系统的最底层
    哪怕只是小小的改变也会引起一系列的影响
    这样就需要系统全面的改变
    或者选择不影响系统的硬件方法

    更何况引进的一种硬件本身未必有什么好的用处
    或者原有系统根本无法使用它

    为了避免这种种冲突,
    最好的办法应该是
    系统制造者自己选择自己的硬件,自己编写自己的系统

    对使用者来说每个人需要的系统中的内容不会是一样的
    个人自主选择操作系统来使用是使用系统的方法

    操作系统是非常重要的
    要根据个人的情况选择、使用、修改或者创新

    十一)总结查询和设置字符集的命令

    1)查看当前字符集

    windows的注册表中
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\下
    ACP值为目前的GUI代码页

    windows系统命令提示符可使用chcp命令

    linux系统使用locale命令返回当前字符集信息

    locale -a 可以查询linux系统支持的所有字符集

    oracle数据库查nls_database_parameters
    使用select * from nls_database_parameters;
    语句得到数据库字符集信息
    使用SELECT * FROM v$nls_parameters;
    得到当前会话的字符集信息

    操作系统和数据库使用的字符集是系统或oracle安装时选择的
    不建议去改动它
    数据库字符集虽然可以强行更改
    但要求新字符集必须是原字符集的超集
    否则会产生严重的错误如数据库无法启动或数据库中数据损坏

    2)设置NLS_LANG参数

    windows系统级永久更改NLS_LANG
    可以更改注册表或环境变量

    regedit进入注册表

    NLS_LANG的位置
    版本 8 , 8i and 9i:
    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\
    “x”为定义Oracle home的唯一值

    版本 10g 及以上:
    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_

    在这个位置可以修改NLS_LANG选项的值
    注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE路径只要在操作系统安装了oracle才有

    windows 我的电脑->属性->高级->环境变量
    在系统或者用户变量设置NLS_LANG

    linux系统级别永久更改NLS_LANG
    也可以更改环境变量

    在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效

    linux用户级别
    可以编辑用户的 bash_profile 文件进行永久设置
    vi .bash_profile
    NLS_LANG=”Simplified Chinese_china”.ZHS16GBK export NLS_LANG
    重启系统
    或者执行 source .bash_profile
    使 bash_profile 设置立即生效
    这个设置在使用此用户登陆的所有会话中有效

    临时更改
    就是会话级别的更改,变量在关闭shell时失效

    windows系统shell中
    使用set命令
    如:
    set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

    linux系统shell中
    使用export命令
    如:
    export NLS_LANG=”SIMPLIFIED CHINESE_CHINA.ZHS16GBK”

    在shell中这样的更改只在这一个shell中有效

    3)查看NLS_LANG

    windows的shell中

    set NLS_LANG
    echo %NLS_LANG%

    linux的shell中

    env | grep NLS_LANG
    echo $NLS_LANG

    sqlplus软件中执行shell命令也可以查看NLS_LANG

    如果sqlplus运行在windows的shell中
    在命令前加上$或host

    如果sqlplus运行在linux的shell中
    在命令前要加上!或host

    如sqlplus在window的shell中:

    SQL> $ echo %NLS_LANG%
    SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    
    SQL> host echo %NLS_LANG%
    SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    
    SQL> host set NLS_LANG
    NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    
    SQL> $ set NLS_LANG
    NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

    如sqlplus在linux的shell中:

    SQL> host echo $NLS_LANG
    SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    
    SQL> ! echo $NLS_LANG
    SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    
    SQL> host env | grep NLS_LANG
    NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    
    SQL> ! env | grep NLS_LANG
    NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

    字符集在oracle中使用是很复杂的
    有很多关联的数据字典或视图
    用几行文字难以说清,可慢慢在使用中熟悉

    2017年10月22日
    文字:韵筝

    展开全文
  • . 安装与配置MYSQL 二 . 常用mysql命令行命令 1 .mysql的启动与停止 启动MYSQL服务 net start mysql 停止MYSQL服务 net stop mysql 2 . netstat –na | findstr 3306 查看被监听的端口 , findstr用于查找...
    一 . 安装与配置MYSQL
    
    二 . 常用mysql命令行命令
    1 .mysql的启动与停止
    启动MYSQL服务 net start mysql
    停止MYSQL服务 net stop mysql
    2 . netstat –na | findstr 3306 查看被监听的端口 , findstr用于查找后面的端口是否存在
    3 . 在命令行中登陆MYSQL控制台 , 即使用 MYSQL COMMEND LINE TOOL
         语法格式 mysql –user=root –password=123456 db_name
           或 mysql –uroot –p123456 db_name
    4 . 进入MYSQL命令行工具后 , 使用status; 或/s 查看运行环境信息
    5 . 切换连接数据库的语法 : use new_dbname;


      
    6 . 显示所有数据库 : show databases;


    7 . 显示数据库中的所有表 : show tables;


    8 . 显示某个表创建时的全部信息 : show create table table_name;


    9 . 查看表的具体属性信息及表中各字段的描述
       Describe table_name; 缩写形式 : desc table_name;
    三 。 MySql中的SQL语句
    1 . 数据库创建 : Create database db_name;
    数据库删除 : Drop database db_name; 删除时可先判断是否存在,写成 : drop database if exits db_name
      
    2 . 建表 : 创建数据表的语法 : create table table_name (字段1 数据类型 , 字段2 数据类型);
       例 : create table mytable (id int , username char(20));
       删表 : drop table table_name; 例 : drop table mytable;


    8 . 添加数据 : Insert into 表名 [(字段1 , 字段2 , ….)] values (值1 , 值2 , …..);
    如果向表中的每个字段都插入一个值,那么前面 [ ] 括号内字段名可写也可不写
       例 : insert into mytable (id,username) values (1,’zhangsan’);


    9 . 查询 : 查询所有数据 : select * from table_name;
    查询指定字段的数据 : select 字段1 , 字段2 from table_name;
    例 : select id,username from mytable where id=1 order by desc;多表查询语句------------参照第17条实例


    10 . 更新指定数据 , 更新某一个字段的数据(注意,不是更新字段的名字)
    Update table_name set 字段名=’新值’ [, 字段2 =’新值’ , …..][where id=id_num] [order by 字段 顺序]
    例 : update mytable set username=’lisi’ where id=1;
    Order语句是查询的顺序 , 如 : order by id desc(或asc) , 顺序有两种 : desc倒序(100—1,即从最新数据往后查询),asc(从1-100),Where和order语句也可用于查询select 与删除delete


    11 . 删除表中的信息 :
         删除整个表中的信息 : delete from table_name;
       删除表中指定条件的语句 : delete from table_name where 条件语句 ; 条件语句如 : id=3;
      
    12 . 创建数据库用户
    一次可以创建多个数据库用户如:
    CREATE USER username1 identified BY ‘password’ , username2 IDENTIFIED BY ‘password’….


    13 . 用户的权限控制:grant
       库,表级的权限控制 : 将某个库中的某个表的控制权赋予某个用户
       Grant all ON db_name.table_name TO user_name [ indentified by ‘password’ ];


    14 . 表结构的修改
    (1)增加一个字段格式:
    alter table table_name add column (字段名 字段类型); ----此方法带括号
    (2)指定字段插入的位置:
    alter table table_name add column 字段名 字段类型 after 某字段;
    删除一个字段:
    alter table table_name drop字段名;
    (3)修改字段名称/类型
    alter table table_name change 旧字段名 新字段名 新字段的类型;
    (4)改表的名字
    alter table table_name rename to new_table_name;
    (5)一次性清空表中的所有数据
    truncate table table_name; 此方法也会使表中的取号器(ID)从1开始


    15 . 增加主键,外键,约束,索引。。。。(使用方法见17实例)
    ① 约束(主键Primary key、唯一性Unique、非空Not Null)
    ② 自动增张 auto_increment
    ③外键Foreign key-----与reference table_name(col_name列名)配合使用,建表时单独使用
    ④ 删除多个表中有关联的数据----设置foreign key 为set null ---具体设置参考帮助文档


    16 . 查看数据库当前引擎
       SHOW CREATE TABLE table_name;
       修改数据库引擎
       ALTER TABLE table_name ENGINE=MyISAM | InnoDB;


    17 . SQL语句运用实例:
    --1 建users表
    create table users (id int primary key auto_increment,nikename varchar(20) not null unique,password varchar(100) not null,address varchar(200), reg_date timestamp not null default CURRENT_TIMESTAMP);


    --2 建articles表,在建表时设置外键
    create table articles (id int primary key auto_increment,content longtext not null,userid int,constraint foreign key (userid) references users(id) on delete set null);


    -----------------------------------------------------------------------
    --2.1 建articles表,建表时不设置外键
       create table articles (id int primary key auto_increment,content longtext not null,userid int);
    --2.2 给articles表设置外键
       alter table articles add constraint foreign key (userid) references users(id) on delete set null;
    ------------------------------------------------------------------------


    --3. 向users表中插入数据,同时插入多条
    insert into users (id,nikename,password,address) values (1,'lyh1','1234',null),(10,'lyh22','4321','湖北武汉'),(null,'lyh333','5678','北京海淀');


    --4. 向article中插入三条数据
    insert into articles (id,content,userid) values (2,'hahahahahaha',11),(null,'xixixixixix',10),(13,'aiaiaiaiaiaiaiaiaiaiaiaia',1),(14,'hohoahaoaoooooooooo',10);


    --5. 进行多表查询,选择users表中ID=10的用户发布的所有留言及该用户的所有信息
    select articles.id,articles.content,users.* from users,articles where users.id=10 and articles.userid=users.id order by articles.id desc;


    --6. 查看数据库引擎类型
    show create table users;


    --7. 修改数据库引擎类型
    alter table users engine=MyISAM; ---因为users表中ID被设置成外键,执行此句会出错


    --8. 同表查询,已知一个条件的情况下.查询ID号大于用户lyh1的ID号的所有用户
    select a.id,a.nikename,a.address from users a,users b where b.nikename='lyh1' and a.id>b.id;
    ------也可写成
    select id,nikename,address from users where id>(select id from users where nikename='lyh1');


    9. 显示年龄比领导还大的员工:
    select a.name from users a,users b where a.managerid=b.id and a.age>b.age;


    查询编号为2的发帖人: 先查articles表,得到发帖人的编号,再根据编号查users得到的用户名。
    接着用关联查询.
    select * from articles,users得到笛卡儿积,再加order by articles.id以便观察
      
    使用select * from articles,users where articles.id=2 筛选出2号帖子与每个用户的组合记录


    再使用select * from articles,users where articles.id=2 and articles.userid=users.id选出users.id等于2号帖的发帖人id的记录.
      
    只取用户名:select user where user.id=(select userid from articles where article.id =2)


    找出年龄比小王还大的人:假设小王是28岁,先想找出年龄大于28的人
    select * from users where age>(select age from users where name='xiaowang');
    *****要查询的记录需要参照表里面的其他记录:
    select a.name from users a,users b where b.name='xiaowang' and a.age>b.age


    表里的每个用户都想pk一下.select a.nickname,b.nickname from users a,users b where a.id>b.id ;


    更保险的语句:select a.nickname,b.nickname from (select * from users order by id) a,(se
    lect * from users order by id) b where a.id>b.id ;


    再查询某个人发的所有帖子.
    select b.* from articles a , articles b where a.id=2 and a.userid=b.userid


    说明: 表之间存在着关系,ER概念的解释,用access中的示例数据库演示表之间的关系.只有innodb引擎才支持foreign key,mysql的任何引擎目前都不支持check约束。
    四、字符集出现错误解决办法
    出现的问题:
    mysql> update users
    -> set username='关羽'
    -> where userid=2;
    ERROR 1366 (HY000): Incorrect string value: '/xB9/xD8/xD3/xF0' for column 'usern
    ame' at row 1
    向表中插入中文字符时,出现错误。


    mysql> select * from users;
    +--------+----------+
    | userid | username |
    +--------+----------+
    | 2 | ???? |
    | 3 | ???? |
    | 4 | ?í?ù |
    +--------+----------+
    3 rows in set (0.00 sec)
    表中的中文字符位乱码。
    解决办法:
    使用命令:
    mysql> status;
    --------------
    mysql Ver 14.12 Distrib 5.0.45, for Win32 (ia32)


    Connection id: 8
    Current database: test
    Current user: root@localhost
    SSL: Not in use
    Using delimiter: ;
    Server version: 5.0.45-community-nt MySQL Community Edition (GPL)
    Protocol version: 10
    Connection: localhost via TCP/IP
    Server characterset: latin1
    Db characterset: latin1
    Client characterset: gbk
    Conn. characterset: gbk
    TCP port: 3306
    Uptime: 7 hours 39 min 19 sec
    Threads: 2 Questions: 174 Slow queries: 0 Opens: 57 Flush tables: 1 Open ta
    bles: 1 Queries per second avg: 0.006
    --------------
    查看mysql发现Server characterset,Db characterset的字符集设成了latin1,所以出现中文乱码。


    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | users |
    +----------------+
    1 row in set (0.00 sec)


    更改表的字符集。
    mysql> alter table users character set GBK;
    Query OK, 3 rows affected (0.08 sec)
    Records: 3 Duplicates: 0 Warnings: 0


    查看表的结构:
    mysql> show create users;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
    corresponds to your MySQL server version for the right syntax to use near 'users
    ' at line 1
     
    mysql> show create table users;
    +-------+-----------------------------------------------------------------------
    ------------------------------------------------------------------------------+
    | Table | Create Table
    |
    +-------+-----------------------------------------------------------------------
    ------------------------------------------------------------------------------+
    | users | CREATE TABLE `users` (
    `userid` int(11) default NULL,
    `username` char(20) character set latin1 default NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk |
    +-------+-----------------------------------------------------------------------
    ------------------------------------------------------------------------------+
    1 row in set (0.00 sec)


    mysql> desc users;
    +----------+----------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +----------+----------+------+-----+---------+-------+
    | userid | int(11) | YES | | NULL | |
    | username | char(20) | YES | | NULL | |
    +----------+----------+------+-----+---------+-------+
    2 rows in set (0.02 sec)


    这时向表中插入中文然后有错误。
    mysql> insert into users values(88,'中文');
    ERROR 1366 (HY000): Incorrect string value: '/xD6/xD0/xCE/xC4' for column 'usern
    ame' at row 1
    mysql> insert into users values(88,'中文');
    ERROR 1366 (HY000): Incorrect string value: '/xD6/xD0/xCE/xC4' for column 'usern
    ame' at row 1


    还要更改users表的username的字符集。
    mysql> alter table users modify username char(20) character set gbk;
    ERROR 1366 (HY000): Incorrect string value: '/xC0/xEE/xCB/xC4' for column 'usern
    ame' at row 1
    mysql> alter table users modify username char(20) character set gbk;
    ERROR 1366 (HY000): Incorrect string value: '/xC0/xEE/xCB/xC4' for column 'usern
    ame' at row 1


    因为表中已经有数据,所以更改username字符集的操作没有成***
    清空users表中的数据
    mysql> truncate table users;
    Query OK, 3 rows affected (0.01 sec)


    从新更改user表中username的字符集
    mysql> alter table users modify username char(20) character set gbk;
    Query OK, 0 rows affected (0.06 sec)
    Records: 0 Duplicates: 0 Warnings: 0


    这时再插入中文字符,插入成***。
    mysql> insert into users values(88,'中文');
    Query OK, 1 row affected (0.01 sec)


    mysql> select * from users;
    +--------+----------+
    | userid | username |
    +--------+----------+
    | 88 | 中文 |
    +--------+----------+

    1 row in set (0.00 sec)

    mysql>

    原文链接:http://blog.csdn.net/ancky_zhang/article/details/3078540

    展开全文
  • BAT机器学习面试1000题系列(第1~305题)

    万次阅读 多人点赞 2017-09-28 11:37:49
    BAT机器学习面试1000题系列 整理:July、元超、立娜、德伟、贾茹、王剑、AntZ、孟莹等众人。本系列大部分题目来源于...说明:本系列作为国内首AI题库,首发于七月在线实验室公众号上:julyedulab,并部分更新...
  • 1、使用字符串拼接的不好的地方: using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Web; namespace Web1...
  • 某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。 操作分为查询(query)、修改...
  • . 安装与配置MYSQL二 . 常用mysql命令行命令1 .mysql的启动与停止启动MYSQL服务 net start mysql停止MYSQL服务 net stop mysql2 . netstat –na | findstr 3306 查看被监听的端口 , finds
  • 如何用python修改excel表某列内容

    千次阅读 多人点赞 2021-06-10 13:44:58
    现在假设,你要做的事情,是填充好后面几月每个员工编号,并且给员工随机生成一个2000到50000之间的随机数作为该月的工资,能拿多少全靠天意,你为了锻炼自己的python能力决定写一个相关的代码: 1 库引入 首先...
  • 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据...
  • JDBC实现员工管理系统(

    千次阅读 2017-08-13 21:55:12
    1、想通过Java对Oracle数据库进行操作,那么就要首先加载驱动,将Oracle下面的JDBC的jar包导入到工作区来,并加入到lib里面,然后build path,这时候就会自动创建一个reference libraries ,里面自动加载了导入的...
  • 全书压缩打包成4部分,这是第1部分 注:本系列图书的第I、II卷再版时均相应改名《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《Java开发实战1200例》分为I...
  • 某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。 算法思想 建立...
  • 实例228 设置ComboBox控件的默认选项为第一项 实例229 将数据表中的字段添加到ComboBox控件中 实例230 在ComboBox下拉列表中显示图片 实例231 用ComboBox控件制作浏览器网址输入框 实例232 实现带查询功能的...
  • 第1篇 Java语法与面向对象技术 第1章 开发环境的应用 2 1.1 Java环境 3 实例001 下载JDK开发工具包 3 实例002 把JDK工具包安装到指定磁盘 4 实例003 设置JDK的环境变量 6 实例004 验证Java开发环境 7 实例005 下载并...
  • 第1篇 Java语法与面向对象技术 第1章 开发环境的应用 2 1.1 Java环境 3 实例001 下载JDK开发工具包 3 实例002 把JDK工具包安装到指定磁盘 4 实例003 设置JDK的环境变量 6 实例004 验证Java开发环境 7 实例005 下载并...
  • 第1篇 Java语法与面向对象技术 第1章 开发环境的应用 2 1.1 Java环境 3 实例001 下载JDK开发工具包 3 实例002 把JDK工具包安装到指定磁盘 4 实例003 设置JDK的环境变量 6 实例004 验证Java开发环境 7 实例005 下载并...
  • mySql 入门基础练习(建表,增删查) 练习1: /*部门表:部门编号,部门名,部门地址*/ create TABLE DEPT( DEPT_number int primary key, DEPT_name varchar(18), DEPT_address varchar(15) ); INSERT ...
  • 实例228 设置ComboBox控件的默认选项为第一项 实例229 将数据表中的字段添加到ComboBox控件中 实例230 在ComboBox下拉列表中显示图片 实例231 用ComboBox控件制作浏览器网址输入框 实例232 实现带查询功能的...
  • 实例228 设置ComboBox控件的默认选项为第一项 实例229 将数据表中的字段添加到ComboBox控件中 实例230 在ComboBox下拉列表中显示图片 实例231 用ComboBox控件制作浏览器网址输入框 实例232 实现带查询功能的...
  • 某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。 操作分为查询(query)、修改...
  • insert -- 增 delete -- 删 truncate -- 删 update -- select -- 查 -- 更删改查实例 ( select * from constraint_test; insert constraint_test value (null,'田七','男',3); -- 增值列可以写列...
  • 语言十天课程笔记1. 内容安排2. 作用域3. 变量分类4 函数分类5. 内存分区内存操作7. 内存操作8. 结构体 1. C语言基础 操作系统:管理硬件资源。 针对普通用户,图形界面. 针对开发人员,命令行窗口、系统调用。...
  • 实例229 用First或Last求数据表中第一条或最后一条 7.11 多表查询(连接查询) 实例230 多表连接查询 实例231 在连接查询中使用表别名 实例232 使用UNION关键字合并多结果集 7.12 嵌套查询 实例233 简单...
  • PDF格式扫描版,共压缩5部分,这是第1部分。 内容简介 本系列图书包括第I卷、第II卷共计1200例子,本文档是第I卷,共计603例子。本书以开发人员在项目开发中经常遇到的问题和必须掌握的技术中心,介绍了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,563
精华内容 6,625
关键字:

员工编号的第一个字符改为1