検索

ホームページ  >  に質問  >  本文

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日前846

全員に返信(5)返信します

  • 怪我咯

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

    1 smallint、int、長さを設定してもしなくても違いはありません
    2 utf8 255/3 gbk 25​​5/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) の後に ZEROFILL を追加すると違いがわかります。これはバイトではなく 255 文字を表します。これは実験できますが、いくつかの人々は古いバージョンはバイトだと言います。文字の場合は、漢字 255 文字を格納でき、UTF8 では漢字 1 文字が 1 文字、1 文字が 3 バイトとしてカウントされるため、バイト数は 255/3 となります。
    3. これは主に、バックグラウンドで時間を分割するためです。年、月、日、時、分、秒のフィールドをさらに追加できます。もちろん、mysql には HOUR(時刻)、SECOND(時刻)、MONTH(時刻)

    などの処理できる関数もあります。

    返事
    0
  • 大家讲道理

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

    1. 他の人が言っているように、括弧内の数字は単なる埋め込み数字であり、フィールドによって表される値の範囲には影響しません。この埋め込み数字は、フィールドをゼロフィルに設定した場合にのみ使用されます。違いを反映します。
    2. 以下で説明する小さなテストを実行します。
    3. データの量が多く、日付フィールドがクエリ条件の 1 つである場合は、その方が良いでしょう。タイムスタンプ ストレージを使用する場合は Kill、それ以外の場合は、必要に応じて datedatetimetimestamp を使用するか、必要に応じて年 (smallint)、月 (tinyint)、日 (tinyint) などのフィールドを追加します。 ;

    質問 1 と 2 については、次のように新しいテーブルを作成してテストを実行しました。

    リーリー

    結果:

    リーリー

    ただし、次の動作は sql_mode の設定によって異なります。たとえば、
    は b 値の長さが 11 であるレコードを書き込みます。

    リーリー

    エラーなしでローカル データベースに書き込むことができますが、保存されたデータは 一二三四五六七八九零 です。つまり、10 桁を超えるデータが消去されます
    が、別のローカル データベースでは、エラーが見つかり、Data too long for column 'b' at row 1 を報告しました。
    SELECT @@sql_mode; を通じて、後者には余分な STRICT_TRANS_TABLES があり、ddl 定義を満たさないデータを書き込もうとするとエラーが報告されることがわかりました。

    参考: https://dev.mysql.com/doc/ref...

    返事
    0
  • キャンセル返事