찾다

 >  Q&A  >  본문

java - bigint(20)、smallint(5)

CREATE TABLE `idc_logistics_assign_rules` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `sp_id` bigint(20) unsigned NOT NULL COMMENT '外键关联表ID',
  `creator` varchar(255) NOT NULL COMMENT '创建人工号',
  `gmt_create` datetime NOT NULL COMMENT '创建时间',
  `modifier` varchar(255) NOT NULL COMMENT '修改人工号',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `rule_name` varchar(255) NOT NULL COMMENT '规则名称',
  `rule_json_val` varchar(4096) NOT NULL COMMENT '规则JSON字符串',
  `rule_content` varchar(4096) NOT NULL COMMENT '规则中文描述',
  `type` varchar(128) NOT NULL COMMENT '类型(同机房、同城、区域内、区域外、其他)',
  `rule_lable` varchar(256) NOT NULL COMMENT '标签',
  `is_valid` char(1) NOT NULL COMMENT '是否有效(y/n),默认n',
  `is_deleted` char(1) NOT NULL COMMENT '是否删除',
  `ordering` smallint(5) unsigned NOT NULL COMMENT '排序字段',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_ordering` (`ordering`),
  KEY `idx_rule_content` (`rule_content`(255))
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='表名';

上面是建表的SQL语句,对于其中的数据类型有不明白的地方,如下:
1.smallint(5),我看了smallint本来的范围是:

A smallint is between -32768 and 32767 signed, or 0 and 65535 unsigned.

但是加了smallint(5)之后,对它的范围并没有影响,那么加这个有什么用呢?。假如我不指定括号中的位数呢?它的默认值是要取什么值呢?
2.同理varchar(255)是表示255个字节么?如果要存中文的话,用utf8编码,算上标点符号,大概能存多少个中文汉字呢?
3.另外还有datetime这种数据类型,一般并不指定有效位数的。那么如果我要精确到秒的、精确的分的、精确到月的,数据库中是不能直接这么存的么?只能存一个完整的时间(存一个以1970开始的long型方便),然后查的时候,可以用Mysql提供的函数来过滤??

======================================================================
在列中使用zerofill,如插入int(4),你插入1,显示0001,你插入55555,显示也是55555,插入负数显示为0000,因为mysql自动增加UNSIGNED属性 UNSIGNED不能为负数,当你插入负数时就显示0, 多操作就能理解 希望采纳

天蓬老师天蓬老师2803일 전852

모든 응답(5)나는 대답할 것이다

  • 怪我咯

    怪我咯2017-04-18 09:39:22

    1 smallint, int, 길이를 설정해도 차이가 없습니다.
    2 utf8 255/3 gbk 255/2
    3 일반 시간에 저장된 타임스탬프, FROM_UNIXTIME(unix_timestamp ,format ) mysql의 자체 타임스탬프 변환은 귀하의 요구를 충족시킬 수 있습니다

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 09:39:22

    • int와 같은 경우 뒤에 있는 바이트 괄호는 효과가 없습니다.

    • char와 같은 문자, 문자의 길이는 괄호 안에 제한됩니다

    회신하다
    0
  • 迷茫

    迷茫2017-04-18 09:39:22

    1-깔끔하고 아름답습니다
    2-아마 255/3일 겁니다. 별로 자세히 연구하진 않았습니다
    3-보통 bigint 타임스탬프 또는 타임스탬프/날짜/시간 유형이며 출력을 출력할 때 PHP에서 형식을 지정할 수 있습니다. mysql에서 처리할 필요가 없습니다.

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-18 09:39:22

    1.부호 비트 때문에 smallint의 기본값은 6입니다. 범위, 표시 방법에는 영향을 미치지 않지만 SMALLINT(3)
    2.varchar(255)는 바이트가 아닌 255자를 나타냅니다. 뒤에 ZEROFILL을 추가하면 차이를 확인할 수 있습니다. 실험해 볼 수 있지만 일부 사람들은 이전 버전이 바이트라고 말합니다. 문자라면 한자 255자를 저장할 수 있고, 한자 1자가 1문자이고, UTF8에서는 1문자가 3바이트로 계산되기 때문에 바이트는 255/3입니다.
    3. 이는 주로 배경에서 시간을 나누어 수행되며, 연도, 월, 일, 시, 분, 초 등의 필드를 몇 개 더 추가할 수 있습니다. 물론 mysql에는 HOUR(시간), SECOND(시간), MONTH(시간)

    과 같이 처리할 수 있는 함수도 있습니다.

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-18 09:39:22

    1. 다른 사람들이 말했듯이 괄호 안의 숫자는 단지 채우기 숫자일 뿐이며 필드가 나타내는 값 범위에는 영향을 미치지 않습니다. 이 채우기 숫자는 필드를 zerofill로 설정한 경우에만 사용됩니다. . 차이를 반영하세요.
    2. 아래에서 설명할 간단한 테스트를 직접 수행해 보세요.
    3. 데이터 양이 많고 날짜 필드가 쿼리 조건 중 하나인 경우 더 좋습니다. 타임스탬프 저장소를 사용하려면 필요에 따라 date, datetimetimestamp를 사용하거나 필요에 따라 연도(smallint), 월(tinyint), 일(tinyint)과 같은 필드를 추가하세요. ;

    질문 1, 2에 대해서는 다음과 같이 새로운 테이블을 생성하고 테스트를 해보았습니다.

    으아악

    결과:

    으아악

    그러나 다음 동작은 sql_mode의 설정에 따라 달라집니다. 예를 들어
    는 b 값의 길이가 11인 레코드를 씁니다.

    으아악

    로컬 데이터베이스에 오류 없이 쓸 수 있지만 저장된 데이터는 一二三四五六七八九零입니다. 이는 10자리 이상의 데이터가 삭제된다는 의미입니다.
    그러나 다른 로컬 데이터베이스에서는 I 오류를 발견했습니다. Data too long for column 'b' at row 1을(를) 보고합니다.
    SELECT @@sql_mode;을 통해 후자에 STRICT_TRANS_TABLES이 추가되어 ddl 정의를 충족하지 않는 데이터를 쓰려고 하면 오류가 보고된다는 사실을 발견했습니다.

    참조: https://dev.mysql.com/doc/ref...

    회신하다
    0
  • 취소회신하다