萧又鸣 發表於 2025-10-20 15:59:00

SQL中的参数类型深度解析

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. bit</a></li><li><a href="#_label1">2. float(小数类型)</a></li><li><a href="#_label2">3.decimal(小数类型)</a></li><li><a href="#_label3">4. char(字符串类型)</a></li><li><a href="#_label4">5.varchar(字符串类型)</a></li><li><a href="#_label5">6.日期和时间类型</a></li><li><a href="#_label6">7.enum和set</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>1. bit</h2>
<blockquote><div><span>bit</span> <span>[(M)] : </span> <span>位字段类型。</span> <span>M</span> <span>表示每个值的位数,范围从</span> <span>1</span> <span>到</span> <span>64</span> <span>。如果</span> <span>M</span> <span>被忽略,默认为</span> <span>1</span> <span>。 </span></div></blockquote>
<div><span>如果我们有这样的值,只存放</span> <span>0</span> <span>或</span> <span>1</span> <span>,这时可以定义</span> <span>bit(1)</span> <span>。这样可以节省空间。 </span></div>
<div><div class="jb51code"><pre class="brush:sql;">mysql&gt; create table tt4 ( id int, a bit(8));
Query OK, 0 rows affected (0.01 sec)</pre></div>
<p>同时它是<span>按照</span><span>ASCII</span><span>码对应的值显示。 比如下面这张图里面,65是A所对应的ASCII。</span></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202510/2025102015521689.png" /></p></div>
<p class="maodian"><a name="_label1"></a></p><h2>2. float(小数类型)</h2>
<blockquote><div><span>float</span> <span>[(m, d)] [</span> <span>unsigned</span> <span>] : m</span> <span>指定显示长度,</span> <span>d</span> <span>指定小数位数,占用空间</span> <span>4</span> <span>个字节 </span></div></blockquote>
<p>这个m的意思是小数点前面的位数加上小数点后面的个数要等于这个m,同时如果用户输入的数大于这个m的话,它会先按照四舍五入的方式尝试进化化简,如果化简结果符合这个m的话那它就显示OK,不然的话就插入失败。</p>
<p>我们先设置一个总长度为4,小数点后面有2位的salary。</p>
<div class="jb51code"><pre class="brush:sql;">create table tt6(id int, salary float(4,2));</pre></div>
<p><strong>在下面这张图里面-99.991,最后的一个1被四舍五入掉了。如果我们把这个1换成5,那么这边就会插入失败。</strong></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202510/2025102015521672.png" /></p>
<p class="maodian"><a name="_label2"></a></p><h2>3.decimal(小数类型)</h2>
<blockquote><p><span>decimal</span><span>(m, d) [</span><span>unsigned</span><span>] : </span><span>定点数</span><span>m</span><span>指定长度,</span><span>d</span><span>表示小数点的位数 </span></p></blockquote>
<p>这个看起来和上面那个float一样,区别在于这个<span>decimal的精度更高。</span></p>
<blockquote><p><span>float</span><span>表示的精度大约是</span><span>7</span><span>位。 </span></p>
<p><span>decimal</span><span>整数最大位数</span><span>m</span><span>为</span><span>65</span><span>。支持小数最大位数</span><span>d</span><span>是</span><span>30</span><span>。如果</span><span>d</span><span>被省略,默认为</span><span>0.</span><span>如果</span><span>m</span><span>被省略, 默认是10</span></p></blockquote>
<p>我们看下面的代码和结果,在高精度的情况下,<span>decimal可以保持更高的精度。</span></p>
<div class="jb51code"><pre class="brush:sql;">mysql&gt; create table tt8 ( id int, salary float(10,8), salary2 decimal(10,8));</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202510/2025102015521626.png" /></p>
<p class="maodian"><a name="_label3"></a></p><h2>4. char(字符串类型)</h2>
<blockquote><div><span>char</span> <span>(L): </span> <span>固定长度字符串,</span> <span>L</span> <span>是可以存储的长度,单位为字符,最大长度值可以为</span> <span>255 </span></div></blockquote>
<p>这个没什么好说的,就是普通的char类型,在这边写出来是为了和下面的varchar来进行对比</p>
<p class="maodian"><a name="_label4"></a></p><h2>5.varchar(字符串类型)</h2>
<blockquote><div><span>varchar</span> <span>(L): </span> <span>可变长度字符串,</span> <span>L</span> <span>表示字符长度,最大长度</span> <span>65535</span> <span>个字节</span></div></blockquote>
<div>我们来看下面的这张图,varchar里面的L是6 <span>,表示这里可以存放6个字符。但是如果我们只填入5个字符的话,那它就只显示5个字符。</span></div>
<div>但是如果我们填入超过6个字符的话,那就会报错。</div>
<div>所以我们可以发现,这个varchar有点像那个vector,只不过这个&ldquo;vetcor&rdquo;的上限被L给锁定了。</div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202510/2025102015521653.png" /></p>
<p>那么我们在一些情况下该如何进行选择呢?</p>
<ol><li><span>如果数据确定长度都一样,就使用定长(</span><span>char</span><span>),比如:身份证,手机号,</span><span>md5 </span></li><li><span>如果数据长度有变化</span><span>,</span><span>就使用变长</span><span>(varchar), </span><span>比如:名字,地址,但是你要保证最长的能存的进去。 </span></li><li><span>定长的磁盘空间比较浪费,但是效率高。 </span></li><li><span>变长的磁盘空间比较节省,但是效率低。 </span></li><li><span>定长的意义是,直接开辟好对应的空间 </span></li><li><span>变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。 </span></li></ol>
<p class="maodian"><a name="_label5"></a></p><h2>6.日期和时间类型</h2>
<p><span>常用的日期有如下三个: </span></p>
<p><span>date </span><span>:</span><span>日期 </span><span>&#39;yyyy</span><span>-</span><span>mm</span><span>-</span><span>dd&#39; </span><span>,占用三字节。</span></p>
<p><span>datetime </span><span>时间日期格式 </span><span>&#39;yyyy</span><span>-</span><span>mm</span><span>-</span><span>dd HH:ii:ss&#39; </span><span>表示范围从 </span><span>1000 </span><span>到 </span><span>9999 </span><span>,占用八字节。</span></p>
<p><span>timestamp </span><span>:时间戳,从</span><span>1970</span><span>年开始的 </span><span>yyyy</span><span>-</span><span>mm</span><span>-</span><span>dd HH:ii:ss </span><span>格式和 </span><span>datetime </span><span>完全一致,占用 </span></p>
<p><span>四字节。</span></p>
<p>我们来看下面这张图片,其中date类型的t1就是显示年月日,datetime类型的t2就是显示年月日加上时分秒,而<span>timestam类型的t3不用我们自己设置,它会自动给自己加上执行这条指令时的时间。</span></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202510/2025102015521642.jpg" /></p>
<p>同时如果我们更新了其中的一条数据,那么<span>timestamp </span>也会自动更新时间。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202510/2025102015521617.jpg" /></p>
<p class="maodian"><a name="_label6"></a></p><h2>7.enum和set</h2>
<blockquote><div><span>enum</span> <span>:枚举,</span> <span>&ldquo;</span> <span>单选</span> <span>&rdquo;</span> <span>类型; </span></div>
<div><span>enum(&#39;</span> <span>选项</span> <span>1&#39;,&#39;</span> <span>选项</span> <span>2&#39;,&#39;</span> <span>选项</span> <span>3&#39;,...); </span></div>
<div><span>set</span> <span>:集合,</span> <span>&ldquo;</span> <span>多选</span> <span>&rdquo;</span> <span>类型; </span></div>
<div><span>set(&#39;</span> <span>选项值</span> <span>1&#39;,&#39;</span> <span>选项值</span> <span>2&#39;,&#39;</span> <span>选项值</span> <span>3&#39;, ...); </span></div></blockquote>
<div><span>他们的区别就是enum是单选,而set是多选。</span></div>
<p>我们看下面这张图片,其中set类型的hobby我们插入了两个值,而enum我们只可以插入一个。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202510/2025102015521644.jpg" /></p>
<p>我们看下面这张图,如果我们要查找hobby=B的,那么1和2就不会被选出来,因为这条查找是只有B的。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202510/2025102015521632.png" /></p>
<p>如果我们要查找出所有含有B的,那么我们应该用<span><strong>用</strong></span><span><strong>find_ in_ set</strong>函数。</span></p>
<p><span>通过这个函数我们就可以</span>查找出所有含有B的。</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202510/2025102015521622.png" /></p>
頁: [1]
查看完整版本: SQL中的参数类型深度解析