标签:编码 UTF 约束 插入 mysql null 主键
一、计算机如何存储字符
如何存储英文字符
- ASCII
:对英文字母及其符号进行了编码,总共有128个
- Latin-1
:对欧洲字符进行了编码,总共有256个,兼容ASCII
如何存储中文字符
- GB2312
:对6000多常用的汉字进行了编码,兼容ASCII
- GBK
:对2万多汉字进行了编码,兼容GB2312
- BIG5
:台湾繁体字编码
- Unicode
:对世界上主流国家常用的语言进行了编码,具体分为三种存储方案,UTF-8、UTF-16、UTF-32
MySQL中文乱码产生的原因
MySQL默认使用Latin-1编码,没有对汉字进行编码
解决MySQL中文乱码
set names utf8;
- 设置服务器端创建数据库,存储字符的编码为UTF-8
create database xz charset=utf8;
针对于有部分同学交互模式下依然有乱码:① 退出交互模式② 手动设置命令行的编码为UTF-8 chcp 65001③ 重新进入到交互模式,查询数据即可解决查看时的乱码
练习
编写脚本文件01_sina.sql,先删除再创建数据库sina,设置编码为UTF-8,进入数据库sina,创建保存新闻数据的表news,包含的列有编号、标题、发表时间、来源、详情;插入若干条数据。
二、列类型
在创建数据表的时候,指定的列所能存储的数据类型
create table news( nid 列类型 );
数字型
tinyint 微整型,占1个字节,范围-128~127
smallint 小整型,占2个字节,范围-32768~32767
int 整型,占4个字节,范围-2147483648~2147483647
bigint 大整型,占8个字节,范围
decimal(M,D) 定点小数,小数点不会发生变化,M代表总的有效位数,D代表小数点后的有效位数。(工资)
boolean 布尔型,只有两个值,分别是true和false,通常用于存储只有两个值的数据,例如:是否在线、性别、是否已婚..... true和false是关键字,不能加引号
MySQL中没有真正的布尔型,会转为tinyint,true转为1,false转为0
日期时间型
date 日期型, 格式 '2022-10-20'
time 时间型,格式 '14:29:30'
datetime 日期时间型, 格式 '2022-10-20 14:29:30'
字符串型
varchar(M) 变长字符串,不会产生空间浪费,数据操作速度相对慢,通常用于存储变化长度的数据,例如:标题、姓名、文章详情... M的最大值是65535
char(M) 定长字符串,可能会产生空间浪费,数据操作速度相对快,通常用于存储固定长度的数据,例如:身份证号码、手机号码... M的最大值是255
text(M) 大型变成字符串,M的最大值是2GB
|
varchar(5)
|
char(5)
|
a
|
a\0
|
a\0\0\0\0
|
ab
|
ab\0
|
ab\0\0\0
|
一二三
|
一二三\0
|
一二三\0\0
|
选择使用合理的列类型
create table t1( id int, title varchar(64), is_have boolean, -- true -1 false -0 ctime datetime, phone char(11), detail varchar(10240) );
三、列约束
MySQL可以对插入的值进行验证,只有通过验证才允许插入,例如:编号不能出现重复、性别只能是男或者女、....
create table laptop( lid int 列约束 );
1.主键约束
primary key :声明了主键约束的列,不能插入重复的值,一个表中只能有一个主键约束,通常加在编号列,会加快数据的查询速度。
null:空,表示一个暂时无法确定的值,例如:无法确定一个商品的价格,无法确定一个员工性别....
主键约束的列禁止插入null
2.非空约束
not null:声明了非空约束的列,不允许插入null
3.唯一约束
unique:声明了唯一约束的列,禁止插入重复的值,允许插入null,甚至多个null
主键约束 = 唯一约束 + 非空约束
自增列
auto_increment:自动增长,声明了自增列,在插入值的时候,只需要赋值为null,就会获取最大值然后加1插入。
自增列必须添加在整数形式的主键列上
标签:编码,
UTF,
约束,
插入,
mysql,
null,
主键
From: https://www.cnblogs.com/liangdian0828/p/17212533.html