🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
考虑多语言与移植的问题,选取合理的字符集。 1、字符集 字符集就是一个字符 <-> 二进制字节的映射表。 字符集是一套符号和编码的规则,不论是在 oracle 数据库还是在 mysql 数据库,都存在字符集的选择问题,而且如果在数据库创建阶段没有正确选择字符集,那么可能在后期需要更换字符集,而字符集的更换是代价比较高的操作,也存在一定的风险,所以我们推荐在应用开始阶段,就按照需求正确的选择合适的字符集,避免后期不必要的调整。 字符集的选择: ① 节省空间,建议在能够完全满足应用的前提下,尽量使用小的字符集。因为更小的字符集意味着能够节省空间、减少网络传输字节数,同时由于存储空间的较小间接的提高了系统的性能。有很多字符集可以保存汉字,比如 utf8、gb2312、gbk、gb18030 等等,但是常用的是 gb2312 和 gbk。 ② 兼容性,因为 gb2312 字库比 gbk 字库小,有些偏僻字(例如:洺)不能保存,因此在选择字符集的时候一定要权衡这些偏僻字在应用出现的几率以及造成的影响。 ③ 在互联网上,国际化的趋势不可避免,且存储空间已经越来海量化,因此推荐用 utf8,如果开发内网系统,如内部 OA 等,可以考虑 gbk。 2、校对集(排序规则) 校对规则是某个字符集的排序规则,就是对字符集中的字符的"座次表"。 一个字符集至少有一个校对集,默认都有一个校对集。 show charset; #查看所有字符集 show collation; #查看所有字符集的校对集 3、乱码 字符本来的字符集与展示时的字符集不一致就会发生乱码。 产生乱码的过程: ① 客户端在提交数据时需要告诉连接器这些数据的字符集(即客户端字符集); ② 连接器需要将数据按照数据库声明的字符集转换一下,然后存起来; ③ 查询数据库的时候,会将数据从数据库的字符集转换成默认设置的查询结果字符集; 连接器的字符集一般使用比较大的字符集(gbk 或 utf8),避免丢失数据。 三种字符集的设置: ① 客户端(client)字符集 set character_set_client = utf8; ② 连接器(connection)字符集 set character_set_connection = utf8; ③ 查询结果(results)字符集 set character_set_results = utf8; 同时设置以上三种字符集 set names gbk; 4、指定字符集方式 create database db1 charset utf8; create database db1 charset = utf8; create database db1 (default) character set utf8; 5、四个级别的编码格式 服务器级别 如果为服务器指定了一个编码格式,在创建数据库的时候,如果没有特殊说明,都是使用该编码格式。 数据库级别 如果为数据库指定了一个编码格式,在创建表的时候默认编码格式就是数据库的编码格式,当然也可以指定某个表的编码格式。 数据表级别 如果我们为某个表指定了自己的字符集,它将不继承数据库的字符集。 数据列级别 这个很少用,MySQL 也是为了保证和其他产品的兼容性才有这个古怪的规定。 修改字符集: alter table tbl_name charset utf8; #修改表编码格式 alter table tbl_name change 旧列名 新列名 列类型 列级完整性约束; #修改列编码格式 6、模式(SQL Mode) SQL Mode 定义了 MySQL 应支持的 SQL 语法、数据校验等,可以完成不同严格程度的数据校验,有效地保障数据准确性。 select @@sql_mode; #show variables like '%sql_mode%'; set [global|session] sql_mode = '模式名'; #global 表示在下次连接生效,session 表示本次连接生效。 对于 CURD 在不同模式下得到的结果都是不同的,大部分情况都一致,三种常见的模式: ① ANSI,它等同于 REAL_AS_FLOAT PIPES_AS_CONCAT ANSI_QUOTES IGNORE_SPACE ANSI 等组合模式,这种模式使语法和行为更符合标准的SQL,这样应用在不同数据库之间进行迁移时,则不需要对业务 SQL 进行较大的修改。 ② STRICT_TRANS_TABLES(严格模式),它适用于事务表和非事务表。 它是严格模式,不允许非法日期,也不允许超过字段长度的值插入字段中,对于插入不正确的值给出错误而非警告。 ③ TRADITIONAL,它等同于 STRICT_TRANS_TABLES STRICT_ALL_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO TRADITIONAL NO_AUTO_CREATE_USER 等组合模式,所以他也是严格模式,对于插入不正确的值是给出错误而非警告,可以应用在事务表和非事务表,用在事务表是,只要是出现错误就会立即回滚。