Rumah > Soal Jawab > teks badan
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, 多操作就能理解 希望采纳
怪我咯2017-04-18 09:39:22
1 smallint, int, tiada beza jika anda menetapkan panjang atau tidak menetapkan panjang
2 utf8 255/3 gbk 255/2
3 Cap masa yang disimpan dalam masa umum, FROM_UNIXTIME(unix_timestamp ,format ) cap waktu mysql sendiri kepada penukaran masa boleh memenuhi keperluan anda
PHP中文网2017-04-18 09:39:22
Untuk perkara seperti int, kurungan bait di belakangnya tidak mempunyai kesan
Watak seperti char, panjang watak adalah terhad dalam kurungan
迷茫2017-04-18 09:39:22
1-Kemas dan cantik
2-Mungkin 255/3, saya tidak mempelajarinya terlalu teliti
3-Biasanya ia adalah jenis cap masa atau cap masa/masa tarikh yang besar, dan PHP boleh memformatkannya apabila mengeluarkan Output tidak perlu diproses oleh mysql.
高洛峰2017-04-18 09:39:22
1.Nilai lalai smallint ialah 6 kerana bit tanda. Ia tidak mempunyai kesan pada julat, cara untuk memaparkannya, tetapi anda boleh melihat perbezaannya dengan menambah ZEROFILL selepas SMALLINT(3)
2.varchar(255) mewakili 255 aksara, bukan bait, ini Anda boleh mencuba, tetapi beberapa orang mengatakan bahawa versi lama adalah bait. Jika ia adalah aksara, anda boleh menyimpan 255 aksara Cina, dan baitnya ialah 255/3, kerana satu aksara Cina ialah satu aksara dan satu aksara dikira sebagai 3 bait dalam UTF8.
3. Ini terutamanya kerana anda membahagikan masa di latar belakang Anda boleh menambah beberapa lagi medan tahun, bulan, hari, jam, minit dan saat. Sudah tentu mysql juga mempunyai fungsi yang boleh diproses seperti: JAM(masa), KEDUA(masa), BULAN(masa)
大家讲道理2017-04-18 09:39:22
1. Seperti yang orang lain katakan, nombor dalam kurungan hanyalah nombor isian dan tidak mempunyai kesan pada julat nilai yang diwakili oleh medan ini hanya akan digunakan apabila anda menetapkan medan kepada isian sifar . Renungkan perbezaannya;
2. Buat ujian kecil sendiri, yang akan dibincangkan di bawah; untuk menggunakan storan cap masa, jika tidak, gunakan
, date
dan datetime
mengikut keperluan, atau tambah medan seperti tahun (timestamp
), bulan (smallint
), hari (tinyint
) seperti yang diperlukan ; tinyint
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(4) unsigned zerofill DEFAULT NULL,
`b` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
INSERT INTO test
(a, b)
VALUES
(1, '1234567890'),
(11, '零一二三四五六七八九');
Keputusan:
mysql> select * from test;
+----+------+--------------------------------+
| id | a | b |
+----+------+--------------------------------+
| 1 | 0001 | 1234567890 |
| 2 | 0011 | 一二三四五六七八九零 |
+----+------+--------------------------------+
2 rows in set (0.01 sec)
Tetapi kelakuan berikut akan bergantung pada tetapan , contohnya: sql_mode
menulis rekod dengan panjang nilai b ialah 11,
INSERT INTO test
(b)
VALUES
('一二三四五六七八九零一');
Saya boleh menulis ke pangkalan data tempatan tanpa ralat, tetapi data yang disimpan ialah 一二三四五六七八九零
, yang bermaksud bahawa lebih daripada 10 digit data akan dipadamkan tetapi Dalam pangkalan data tempatan yang lain I menemui ralat, melaporkan
. Data too long for column 'b' at row 1
Didapati melalui
bahawa yang terakhir mempunyai SELECT @@sql_mode;
tambahan, yang menyebabkan ralat dilaporkan apabila cuba menulis data yang tidak memenuhi definisi ddl. STRICT_TRANS_TABLES