精华内容
下载资源
问答
  • 是不是代表着本次连接的所有 查询语句 按utf-8去编码 再传给mysql数据库服务器
  • 1,UTF-8在python的开始处,#coding:utf-8或者#coding=utf-8作用一样,声明Python代码的文本格式是UTF-8,按照这种格式来读取程序。如下编写一个脚本:如果不添加#coding=utf-8,脚本有中文时程序会报错2,Unicode和...

    1,UTF-8

    在python的开始处,#coding:utf-8或者#coding=utf-8的作用一样,声明Python代码的文本格式是UTF-8,按照这种格式来读取程序。

    如下编写一个脚本:

    如果不添加#coding=utf-8,脚本有中文时程序会报错

    2,Unicode和UFT-8的区别

    Unicode 是字符集

    UTF-8 是编码规则

    字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)

    编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)

    举一个例子:It's 知乎日报

    你看到的unicode字符集是这样的编码表:

    I 0049

    t 0074

    ' 0027

    s 0073

    0020

    知 77e5

    乎 4e4e

    日 65e5

    报 62a5

    每一个字符对应一个十六进制数字。

    计算机只懂二进制,因此,严格按照unicode的方式(UCS-2),应该这样存储:

    I 00000000 01001001

    t 00000000 01110100

    ' 00000000 00100111

    s 00000000 01110011

    00000000 00100000

    知 01110111 11100101

    乎 01001110 01001110

    日 01100101 11100101

    报 01100010 10100101

    这个字符串总共占用了18个字节,但是对比中英文的二进制码,可以发现,英文前9位都是0!浪费啊,浪费硬盘,浪费流量。

    UTF-8是这样做的:

    单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;

    n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。

    这样就形成了如下的UTF-8标记位:

    0xxxxxxx

    110xxxxx 10xxxxxx

    1110xxxx 10xxxxxx 10xxxxxx

    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

    1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

    ... ...

    于是,”It's 知乎日报“就变成了:

    I 01001001

    t 01110100

    ' 00100111

    s 01110011

    00100000

    知 11100111 10011111 10100101

    乎 11100100 10111001 10001110

    日 11100110 10010111 10100101

    报 11100110 10001010 10100101

    和上边的方案对比一下,英文短了,每个中文字符却多用了一个字节。但是整个字符串只用了17个字节,比上边的18个短了一点点。

    python是支持Unicode的,在使用Unicode时,在字符串前加上u即可。

    展开全文
  • 作者:brightwang原文:https://www.jianshu.com/p/ab9aa8d4df7d最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误:Incorrect string value: ‘ð...

    作者:brightwang原文:https://www.jianshu.com/p/ab9aa8d4df7d

    最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误:

    Incorrect string value: ‘ð

    我用的是UTF-8编码的客户端,服务器也是UTF-8编码的,数据库也是,就连要保存的这个字符串“😃”也是合法的UTF-8。

    问题的症结在于,MySQL的“utf8”实际上不是真正的UTF-8。

    “utf8”只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节。

    MySQL一直没有修复这个bug,他们在2010年发布了一个叫作“utf8mb4”的字符集,绕过了这个问题。

    当然,他们并没有对新的字符集广而告之(可能是因为这个bug让他们觉得很尴尬),以致于现在网络上仍然在建议开发者使用“utf8”,但这些建议都是错误的。

    简单概括如下:

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

    2.MySQL的“utf8”是一种“专属的编码”,它能够编码的Unicode字符并不多。

    我要在这里澄清一下:所有在使用“utf8”的MySQL和MariaDB用户都应该改用“utf8mb4”,永远都不要再使用“utf8”。

    那么什么是编码?什么是UTF-8?

    我们都知道,计算机使用0和1来存储文本。比如字符“C”被存成“01000011”,那么计算机在显示这个字符时需要经过两个步骤:

    1.计算机读取“01000011”,得到数字67,因为67被编码成“01000011”。

    2.计算机在Unicode字符集中查找67,找到了“C”。

    同样的:

    1.我的电脑将“C”映射成Unicode字符集中的67。

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

    几乎所有的网络应用都使用了Unicode字符集,因为没有理由使用其他字符集。

    Unicode字符集包含了上百万个字符。最简单的编码是UTF-32,每个字符使用32位。这样做最简单,因为一直以来,计算机将32位视为数字,而计算机最在行的就是处理数字。但问题是,这样太浪费空间了。

    UTF-8可以节省空间,在UTF-8中,字符“C”只需要8位,一些不常用的字符,比如“”需要32位。其他的字符可能使用16位或24位。一篇类似本文这样的文章,如果使用UTF-8编码,占用的空间只有UTF-32的四分之一左右。

    MySQL的“utf8”字符集与其他程序不兼容,它所谓的“”,可能真的是一坨……

    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定义列(在现在看来,CHAR已经是老古董了,但在那时,在MySQL中使用CHAR会更快,不过从2005年以后就不是这样子了)。

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

    我的猜测是MySQL开发者本来想帮助那些希望在空间和速度上双赢的用户,但他们搞砸了“utf8”编码。

    所以结果就是没有赢家。那些希望在空间和速度上双赢的用户,当他们在使用“utf8”的CHAR列时,实际上使用的空间比预期的更大,速度也比预期的慢。而想要正确性的用户,当他们使用“utf8”编码时,却无法保存像“”这样的字符。

    在这个不合法的字符集发布了之后,MySQL就无法修复它,因为这样需要要求所有用户重新构建他们的数据库。最终,MySQL在2010年重新发布了“utf8mb4”来支持真正的UTF-8。

    为什么这件事情会让人如此抓狂

    因为这个问题,我整整抓狂了一个礼拜。我被“utf8”愚弄了,花了很多时间才找到这个bug。但我一定不是唯一的一个,网络上几乎所有的文章都把“utf8”当成是真正的UTF-8。

    “utf8”只能算是个专有的字符集,它给我们带来了新问题,却一直没有得到解决。

    总结

    如果你在使用MySQL或MariaDB,不要用“utf8”编码,改用“utf8mb4”。这里( https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4 )提供了一个指南用于将现有数据库的字符编码从“utf8”转成“utf8mb4”

    展开全文
  • 满意答案sharita2015.06.24...characterEncoding=UTF-8 ,但是问什么要添加呢?添加的作用是:指定字符的编码、解码格式。例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码。这时候如果添加了useUni...

    满意答案

    sharita

    2015.06.24

    采纳率:40%    等级:10

    已帮助:3572人

    我们在连接mysql数据库的时候一般都会在url后面添加useUnicode=true&characterEncoding=UTF-8 ,但是问什么要添加呢?

    添加的作用是:指定字符的编码、解码格式。

    例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码。这时候如果添加了useUnicode=true&characterEncoding=UTF-8 ,那么作用有如下两个方面:

    1. 存数据时:

    数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。

    2.取数据时:

    在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。

    注意:在xml配置文件中配置数据库utl时,要使用&的转义字符也就是&

    例如:

    10分享举报

    展开全文
  • 如题,最近在和node服务器对接 AES/DES加解密时出现了很多问题,找不到结果,拜托各位大佬解答一下。</p>
  • UTF-8 with BOM是什么意思

    千次阅读 2014-05-02 12:25:18
    其实UTF-8 的BOM对UFT-8没有作用,为了支援UTF-16,UTF-32才加上的BOM,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示,但是会产生输出,就像多了一个空行,

    UTF-8 BOM又叫UTF-8 签名。BOM, byte order mark。

    UTF-8的BOM,是为了支援UTF-16,UTF-32,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别。但是BOM虽然在编辑器中不显示,但是会产生输出,就像多了一个空行。

    展开全文
  • characterEncoding=UTF-8 ,但是问什么要添加呢?添加的作用是:指定字符的编码、解码格式。例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码。这时候如果添加了useUnicode=true&characterEncoding...
  • 今天这篇文章我们来了解一下Python的Filewritelines() 方法,我会在这篇文章之中来讲解python中write方法以及其相关lines方法而且还会将这个write()方法能用在python编程之中的什么地方来进行说明。废话不多说我们...
  • UTF-8UTF-8 without DOM 有什么区别? 在保存非 ANSI 文件时,最好...UTF-8 BOM又叫UTF-8 签名,其实UTF-8 的BOM对UFT-8没有作用,为了支援UTF-16,UTF-32才加上的BOM,BOM签名的意思就是告诉编辑器当前文件采...
  • useUnicode=true&characterEncoding=UTF-8作用

    万次阅读 多人点赞 2019-01-21 15:02:56
    characterEncoding=UTF-8 ,但是问什么要添加呢? 添加的作用是:指定字符的编码、解码格式。  例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码。这时候如果添加了useUnicode=true&amp;...
  • BOM: Byte Order MarkUTF-8 BOM又叫UTF-8 签名,其实UTF-8 的BOM对UFT-8没有作用,为了支持UTF-16,UTF-32才加上的BOM,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BO...
  • UTF-8(无BOM)和UTF8...BOM: Byte Order MarkUTF-8 BOM又叫UTF-8 签名,其实UTF-8 的BOM对UFT-8没有作用,为了支持UTF-16,UTF-32才加上的 BOM,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,...
  • BOM: Byte Order MarkUTF-8 BOM又叫UTF-8 签名,其实UTF-8 的BOM对UFT-8没有作用,为了支持UTF-16,UTF-32才加上的BOM,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示...
  • sys.setdefaultencoding('utf8') name = datas['data']['travel'][0]['surname'] name = urllib.unquote(name).encode('raw-unicode-escape') 直接指明decode的解码方式为什么不行? decode('utf-8')的...
  • mysql 连接url中useUnicode=true&characterEncoding=UTF-8 的作用 2011年11月06日 22:28:41 ...characterEncoding=UTF-8 ,但是问什么要添加呢?   添加的作用是:指定字符的编码、解码格式。   &...
  • characterEncoding=UTF-8 ,但是问什么要添加呢?添加的作用是:指定字符的编码、解码格式。例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码。这时候如果添加了useUnicode=true&characterEncoding...
  • mysql连接url中useUnicode=true&...characterEncoding=UTF-8 ,但是问什么要添加呢? 添加的作用是:指定字符的编码、解码格式。 例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8...
  • html标签中的meta charset="utf-8" 的作用

    万次阅读 多人点赞 2018-09-01 10:13:00
    charset=”utf-8告知浏览器此页面属于什么字符编码格式,下一步浏览器做好“翻译”工作。常见的字符编码有:gb2312、gbk、unicode、utf-8。 各个字符编码含义: gb2312:代表国家标准第2312条,其中不包含...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 733
精华内容 293
关键字:

utf8作用是什么