1 3 7 - 1 4 4 1 - 9 7 9 7
首页 > 品牌伙伴 > 品牌伙伴详细内容

企业建站为何在Mysql中不克不及利用"UFT8"

来源:品牌网站定制 | 作者:品牌网站定制 | 时间:2022-03-18 | 浏览:1200
字体大小:



     把持MYSQL的时分经常会遇到一个标题,试着经由历程 Rails 在以“utf8”编码的 MariaDB 中保存一个 UTF-8 字符串,然后出现了一个分外瑰异的错误:


Incorrect string value: ‘\xF0\x9F\x98\x83 <…’ for column ‘summary’ at row 1


  UTF-8 编码的客户端,办事器也是 UTF-8 编码的,数据库也是,就连要保存的这个字符串“ <…”也是正当的 UTF-8。标题的关键在于,MySQL 的“utf8”理论上不是真正的 UTF-8。“utf8”只撑持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。本来MySQL 一向没有修复这个 bug,他们在 2010 年宣告了一个叫作“utf8mb4”的字符集,绕过了这个标题。他们并没有对这个新的字符集广而告之,以致于现在网络上依旧在发起开辟者把持“utf8”,但是这些发起都是错误的。


庞杂归结综合以下:


(1)MySQL 的“utf8mb4”是真正的“UTF-8”。


(2)MySQL 的“utf8”只是一种“专属的编码”,它可以编码的 Unicode 字符其实不多。


尚品小编这里发起人人:把持“utf8”的 MySQL 和 MariaDB 的用户都该当改用“utf8mb4”,永久都不要再把持“utf8”。


第一、甚么是编码?甚么是 UTF-8?


尽人皆知,较量争论机贮存的本色是二进制,是把持 0 和 1 来存储文本。比如字符“C”被存成“01000011”,那末较量争论机在表示这个字符时必要颠末两个步调:




  1. 我的电脑将“C”映照成 Unicode 字符会合的 67。




  2. 我的电脑将 67 编码成“01000011”,并发送给 Web 办事器。




相对的:




  1. 较量争论机读取“01000011”,获得数字 67,因为 67 被编码成“01000011”。




  2. 较量争论机在 Unicode 字符会合查找 67,品牌网站定制,找到了“C”。




几近通通的网络应用都把持了 Unicode 字符集,因为没有情由把持其他字符集。


Unicode 字符集包括了上百万个字符。最庞杂的编码是 UTF-32,每个字符把持 32 位。如许做最庞杂,因为一向以来,较量争论机将 32 位视为数字,而较量争论机最外行的就是处置责罚数字。但标题是,如许太浪掷空间了。


UTF-8 可以节俭空间,在 UTF-8 中,字符“C”只必要 8 位,其他的字符可以把持 16 位或 24 位。一篇相同本文如许的文章,如果把持 UTF-8 编码,占用的空间只需 UTF-32 的四分之一阁下。


第二、 MySQL 简史


为甚么 MySQL 开辟者会让“utf8”生效?我们大要可以从提交日记中寻找谜底。


MySQL 4.1 版本撑持 UTF-8,也就是 2003 年,而本日把持的 UTF-8 尺度(RFC 3629)是随后才出现的。而旧版的 UTF-8 尺度(RFC 2279)最多撑持每个字符 6 个字节。2002 年 3 月 28 日,MySQL 开辟者在第一个 MySQL 4.1 预览版中把持了 RFC 2279。同年 9 月,他们对 MySQL 源代码住手了一次调剂:“UTF8 现在最多只撑持 3 个字节的序列”。那末是谁提交了这些代码?他为甚么要如许做?这个标题不得而知。在迁徙到 Git 后(MySQL 最开端把持的是 BitKeeper),MySQL 代码库中的良多提交者的名字都损失了。2003 年 9 月的邮件列表中也找不到可以解释这一变卦的线索。


不外可以试着预测一下。


2002 年,MySQL 做出了一个决议:如果用户可以包管数据表的每行都把持相同的字节数,那末 MySQL 就可以在机能方面来一个大提拔。为此,用户必要将文本列界说为“CHAR”,每个“CHAR”列老是具有相同数量的字符。如果拔出的字符少于界说的数量,MySQL 就会在背面添补空格,如果拔出的字符跨越了界说的数量,背面超越部分会被截断。


MySQL 开辟者在最开端测验考试 UTF-8 时把持了每个字符 6 个字节,CHAR(1) 把持 6 个字节,CHAR(2) 把持 12 个字节,并以此类推。


可以说,他们最初的版本才是准确的,惋惜这一版本一向没有宣告。但是文档上却写了,而且广为流传,通通领会 UTF-8 的人都认同文档里写的对象。


不外很明显,MySQL 开辟者或厂商担忧会有效户做这两件事:




  1. 把持 CHAR 界说列。




  2. 将 CHAR 列的编码设置为“utf8”。




小编预测该当是 MySQL 开辟者本来想匡助那些但愿在空间和速度上共赢的用户,但时他们却搞砸了“utf8”编码。


以是结果就是失利的。那些但愿在空间和速度上共赢的用户,当他们在把持“utf8”的 CHAR 列时,理论上把持的空间比预期的更大,速度也比预期的慢。而想要准确性的用户,当他们把持“utf8”编码时,却没法保存像“”如许的字符。


第三、为甚么这个标题很引发人们的留神


关于这个标题,小编已经花费良多时光才找到这个 bug。但是没必要定这是独一的一个,网络上几近通通的文章都把“utf8”当作是真正的 UTF-8。“utf8”只能算是个专有的字符集,它给我们带来了新标题,却一向没有获得处置责罚。



免责声明:本文内容由互联网用户自发贡献自行上传,本网站也不承担相关的法律责任。如果您发现本文章中有涉嫌抄袭的内容,请发送邮件至:sales@sznetsoft.com或者至电给本网站进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权的内容。
相关信息
  • QQ好友
  • QQ空间
  • 腾讯微博
  • 新浪微博
  • 人人网
  • 豆瓣网
  • Facebook
  • Twitter
  • linkedin
  • 谷歌Buzz


线

网软通在线


在线客服: 点击这里给我发消息                        

1231.jpg

留言内容