utf8 订阅
UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部份修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。 [1] 展开全文
UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部份修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。 [1]
信息
作    者
Ken Thompson
创建时间
1992年
定    义
针对Unicode的可变长度字符编码
所属领域
计算机科学技术
中文名
UTF-8
外文名
8-bit Unicode Transformation Format
UTF-8发展历程
在所有字符集中,最知名的可能要数被称为ASCII的8位字符集了。它是美国标准信息交换代码(American Standard Code for Information Interchange)的缩写, 为美国英语通信所设计。它由128个字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)组成。但是,由于它是针对英语设计的,当处理带有音调标号(形如汉语的拼音)的亚洲文字时就会出现问题。因此,创建出了一些包括256个字符的由ASCII扩展的字符集。其中有一种通常被称为IBM字符集,它把值为128-255之间的字符用于画图和画线,以及一些特殊的欧洲字符。另一种8位字符集是ISO 8859-1Latin 1,也简称为ISOLatin-1。它把位于128-255之间的字符用于拉丁字母表中特殊语言字符的编码,也因此而得名。欧洲语言不是地球上的唯一语言,因此亚洲和非洲语言并不能被8位字符集所支持。仅汉语字母表(或pictograms)就有80000以上个字符。但是把汉语、日语和越南语的一些相似的字符结合起来,在不同的语言里,使不同的字符代表不同的字,这样只用2个字节就可以编码地球上几乎所有地区的文字。因此,创建了UNICODE编码。它通过增加一个高字节对ISO Latin-1字符集进行扩展,当这些高字节位为0时,低字节就是ISO Latin-1字符。UNICODE支持欧洲、非洲、中东、亚洲(包括统一标准的东亚象形汉字和韩国表音文字)。但是,UNICODE并没有提供对诸如Braille(盲文),Cherokee, Ethiopic(埃塞俄比亚语), Khmer(高棉语), Mongolian(蒙古语), Hmong(苗语), Tai Lu, Tai Mau文字的支持。同时它也不支持如Ahom(阿霍姆语), Akkadian(阿卡德语), Aramaic(阿拉米语), Babylonian Cuneiform(古巴比伦楔形文字), Balti(巴尔蒂语), Brahmi(婆罗米文), Etruscan(伊特拉斯坎语), Hittite(赫梯语/西台语), Javanese(爪哇语),Numidian(努米底亚语), Old Persian Cuneiform(古波斯楔形文字),Syrian(叙利亚语)之类的古老文字。事实证明,对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Unicode Transformation Format)。常见的UTF格式有:UTF-7, UTF-7.5, UTF-8,UTF-16, 以及 UTF-32。 [2] 
收起全文
精华内容
下载资源
问答
  • UTF8转16进制工具 Utf8ToHex

    千次下载 热门讨论 2013-06-17 13:05:32
    UTF-8字符串转换为Latin1编码,比如中文“你好”转换为“\xE4\xBD\xA0\xE5\xA5\xBD”
  • MySQL中的 utf8 并不是真正的UTF-8编码 ! !

    千次阅读 多人点赞 2020-06-24 16:11:52
    你知道么?MySQL中的utf8编码并不是真正的UTF-8,我们都被MySQL骗了!

    记得去年我在往MySQL存入emoji表情😲😳时,一直出错,无法导入。后来找到办法 -- 通过把utf8改成utf8mb4就可以了,并没有深究。

    一年后,我看到一篇文章讲到emoji文字占4个字节,通常要用utf-8去接收才行,其他编码可能会出错。我突然想到去年操作MySQL把utf8改成utf8mb4的事儿。

    嗯?他本身不就是utf8编码么!那我当时还改个锤子?

    难道,MySQL的utf8不是真正的UTF-8编码吗??! 卧槽这。。MySQL有bug!

    带着疑问查询了很多相关材料,才发现这竟然是MySQL的一个历史遗留问题~~ 我笑了,没想到这么牛B的MySQL也会有这段往事。

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里

    目录

    一、报错回顾

    二、MySQL中utf8的趣事

    1. utf8mb4 才是真正的UTF-8

    2. utf8 的简史

    三、总结

    一张照片背后的故事


    一、报错回顾

    将emoji文字直接写入SQL中,执行insert语句报错;

    INSERT INTO `csjdemo`.`student` (`ID`, `NAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) 
       VALUES ('20', '陈哈哈😓', '男', '20', '181班', '9年级', '看片儿');

    [Err] 1366 - Incorrect string value: '\xF0\x9F\x98\x93' for column 'NAME' at row 1

     

    改了数据库编码、系统编码以及表字段的编码格式 → utf8mb4 之后,就可以了:
     

    INSERT INTO `student` (`ID`, `NAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) 
       VALUES (null, '陈哈哈😓😓', '男', '20', '181班', '9年级', '看片儿');

    二、MySQL中utf8的趣事

    MySQL 的“utf8”实际上不是真正的 UTF-8。

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

    在utf8编码中,中文是占3个字节,其他数字、英文、符号占一个字节。

    但emoji符号占4个字节,一些较复杂的文字、繁体字也是4个字节。所以导致写入失败,应该改成utf8mb4。

    如上图中所示,这是编码改成utf8mb4后入库的数据,大家可以清晰的对比一下所占的字符数、字节数。正因如此,4字节的内容往utf8编码中插入,肯定是不行的,插不进去啊,是吧(大潘摊手)。

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

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


    1. utf8mb4 才是真正的UTF-8

    是的,MySQL 的“utf8mb4”才是真正的“UTF-8”。

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

    在这里Mark一下:所有在使用“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 的四分之一左右。

    2. utf8 的简史

    为什么 MySQL 开发者会让“utf8”失效?我们或许可以从MySQL版本提交日志中寻找答案。

    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 开发者或厂商担心会有用户做这两件事:

    • 使用 CHAR 定义列(在现在看来,CHAR 已经是老古董了,但在那时,在 MySQL 中使用 CHAR 会更快,不过从 2005 年以后就不是这样子了)。
    • 将 CHAR 列的编码设置为“utf8”。

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

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

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

    三、总结

    主要是目前网络上几乎所有的文章都把 “utf8” 当成是真正的 UTF-8,包括之前我写的文章以及做的项目(捂脸);因此希望更多的朋友能够看到这篇文章。

    相信还有很多跟我在同一条船上的人,这是必然的。

    所以,大家以后再搭建MySQL、MariaDB数据库时,记得将数据库相应编码都改为utf8mb4。终有一天,接你班儿的程序员发或你的领导现这个问题后,一定会在心里默默感到你的技术牛B。

    一张照片背后的故事

    张良善在1986年,成为一名西藏运输兵,每条西藏公路上都有他的身影
    1992年,张良善怀孕的妻子,重病住院
    领导了解情况后批准他回家,可当时西藏的将士们缺衣少食
    如果不在恶劣天气来临前运输完物资,将士们很可能有生命危险
    他选择留下来,继续为将士们运输物资
    但当任务结束后,妻子却因难产而死
    最后他亲手雕刻了妻子的墓碑,并跪在坟前痛哭

     

    参考资料

    https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434

    https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4

    展开全文
  • 编码转换工具UTF8转GBK或者GBK转UTF8

    热门讨论 2011-11-15 16:16:21
    编码转换工具UTF8转GBK或者GBK转UTF8,强烈推荐。它支持各类编码互转,且支持批量文件转码。
  • Source Insight 3.X utf8 支持插件for win7 x64

    千次下载 热门讨论 2014-08-25 13:24:44
    Source Insight 3.X utf8 支持插件for win7 x64, 解决原作者,win7 x64不能运行的问题
  • 本文翻译自:Saving utf-8 texts in json.dumps as UTF8, not as \u escape sequence sample code: 样例代码: >>> import json >>> json_string = json.dumps("ברי צקלה") >>> print json_string "\u05d1\u...

    本文翻译自:Saving utf-8 texts in json.dumps as UTF8, not as \u escape sequence

    sample code: 样例代码:

    >>> import json
    >>> json_string = json.dumps("ברי צקלה")
    >>> print json_string
    "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"
    

    The problem: it's not human readable. 问题:这不是人类可读的。 My (smart) users want to verify or even edit text files with JSON dumps (and I'd rather not use XML). 我的(智能)用户想要使用JSON转储来验证甚至编辑文本文件(我宁愿不使用XML)。

    Is there a way to serialize objects into UTF-8 JSON strings (instead of \\uXXXX )? 有没有一种方法可以将对象序列化为UTF-8 JSON字符串(而不是\\uXXXX )?


    #1楼

    参考:https://stackoom.com/question/1EwOd/将utf-文本保存在json-dumps中为UTF-而不是-u转义序列


    #2楼

    Use the ensure_ascii=False switch to json.dumps() , then encode the value to UTF-8 manually: 使用ensure_ascii=False切换到json.dumps() ,然后将值手动编码为UTF-8:

    >>> json_string = json.dumps("ברי צקלה", ensure_ascii=False).encode('utf8')
    >>> json_string
    b'"\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94"'
    >>> print(json_string.decode())
    "ברי צקלה"
    

    If you are writing to a file, just use json.dump() and leave it to the file object to encode: 如果要写入文件,只需使用json.dump()并将其留给文件对象进行编码:

    with open('filename', 'w', encoding='utf8') as json_file:
        json.dump("ברי צקלה", json_file, ensure_ascii=False)
    

    Caveats for Python 2 Python 2警告

    For Python 2, there are some more caveats to take into account. 对于Python 2,还有更多注意事项需要考虑。 If you are writing this to a file, you can use io.open() instead of open() to produce a file object that encodes Unicode values for you as you write, then use json.dump() instead to write to that file: 如果要将其写入文件,则可以使用io.open()而不是open()来生成一个文件对象,该对象在编写时为您编码Unicode值,然后使用json.dump()代替来写入该文件:

    with io.open('filename', 'w', encoding='utf8') as json_file:
        json.dump(u"ברי צקלה", json_file, ensure_ascii=False)
    

    Do note that there is a bug in the json module where the ensure_ascii=False flag can produce a mix of unicode and str objects. 请注意, json模块中存在一个bug,其中ensure_ascii=False标志可以生成unicodestr对象的混合体。 The workaround for Python 2 then is: 那么,Python 2的解决方法是:

    with io.open('filename', 'w', encoding='utf8') as json_file:
        data = json.dumps(u"ברי צקלה", ensure_ascii=False)
        # unicode(data) auto-decodes data to unicode if str
        json_file.write(unicode(data))
    

    In Python 2, when using byte strings (type str ), encoded to UTF-8, make sure to also set the encoding keyword: 在Python 2中,当使用编码为UTF-8的字节字符串(类型str )时,请确保还设置了encoding关键字:

    >>> d={ 1: "ברי צקלה", 2: u"ברי צקלה" }
    >>> d
    {1: '\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94', 2: u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'}
    
    >>> s=json.dumps(d, ensure_ascii=False, encoding='utf8')
    >>> s
    u'{"1": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4", "2": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"}'
    >>> json.loads(s)['1']
    u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
    >>> json.loads(s)['2']
    u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
    >>> print json.loads(s)['1']
    ברי צקלה
    >>> print json.loads(s)['2']
    ברי צקלה
    

    #3楼

    Using ensure_ascii=False in json.dumps is the right direction to solve this problem, as pointed out by Martijn. Martijn指出,在json.dumps中使用suresure_ascii = False是解决此问题的正确方向。 However, this may raise an exception: 但是,这可能会引发异常:

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 1: ordinal not in range(128)
    

    You need extra settings in either site.py or sitecustomize.py to set your sys.getdefaultencoding() correct. 您需要在site.py或sitecustomize.py中进行其他设置,才能正确设置sys.getdefaultencoding()。 site.py is under lib/python2.7/ and sitecustomize.py is under lib/python2.7/site-packages. site.py在lib / python2.7 /下,sitecustomize.py在lib / python2.7 / site-packages下。

    If you want to use site.py, under def setencoding(): change the first if 0: to if 1: so that python will use your operation system's locale. 如果要使用site.py,请在def setencoding()下:将第一个if 0:更改为if 1 :,以便python使用操作系统的语言环境。

    If you prefer to use sitecustomize.py, which may not exist if you haven't created it. 如果您喜欢使用sitecustomize.py,那么如果尚未创建,则可能不存在。 simply put these lines: 只需将这些行:

    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    

    Then you can do some Chinese json output in utf-8 format, such as: 然后,您可以以utf-8格式进行中文json输出,例如:

    name = {"last_name": u"王"}
    json.dumps(name, ensure_ascii=False)
    

    You will get an utf-8 encoded string, rather than \\u escaped json string. 您将获得一个utf-8编码的字符串,而不是\\ u转义的json字符串。

    To verify your default encoding: 验证默认编码:

    print sys.getdefaultencoding()
    

    You should get "utf-8" or "UTF-8" to verify your site.py or sitecustomize.py settings. 您应该获得“ utf-8”或“ UTF-8”来验证site.py或sitecustomize.py设置。

    Please note that you could not do sys.setdefaultencoding("utf-8") at interactive python console. 请注意,您无法在交互式python控制台上执行sys.setdefaultencoding(“ utf-8”)。


    #4楼

    UPDATE: This is wrong answer, but it's still useful to understand why it's wrong. 更新:这是错误的答案,但是了解为什么它仍然是有用的。 See comments. 看评论。

    How about unicode-escape ? unicode-escape怎么样?

    >>> d = {1: "ברי צקלה", 2: u"ברי צקלה"}
    >>> json_str = json.dumps(d).decode('unicode-escape').encode('utf8')
    >>> print json_str
    {"1": "ברי צקלה", "2": "ברי צקלה"}
    

    #5楼

    Peters' python 2 workaround fails on an edge case: Peters的python 2解决方法在边缘情况下失败:

    d = {u'keyword': u'bad credit  \xe7redit cards'}
    with io.open('filename', 'w', encoding='utf8') as json_file:
        data = json.dumps(d, ensure_ascii=False).decode('utf8')
        try:
            json_file.write(data)
        except TypeError:
            # Decode data to Unicode first
            json_file.write(data.decode('utf8'))
    
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 25: ordinal not in range(128)
    

    It was crashing on the .decode('utf8') part of line 3. I fixed the problem by making the program much simpler by avoiding that step as well as the special casing of ascii: 它在第3行的.decode('utf8')部分崩溃。我通过避免该步骤以及ascii的特殊大小写,使程序更加简单,从而解决了该问题:

    with io.open('filename', 'w', encoding='utf8') as json_file:
      data = json.dumps(d, ensure_ascii=False, encoding='utf8')
      json_file.write(unicode(data))
    
    cat filename
    {"keyword": "bad credit  çredit cards"}
    

    #6楼

    Here's my solution using json.dump(): 这是我使用json.dump()的解决方案:

    def jsonWrite(p, pyobj, ensure_ascii=False, encoding=SYSTEM_ENCODING, **kwargs):
        with codecs.open(p, 'wb', 'utf_8') as fileobj:
            json.dump(pyobj, fileobj, ensure_ascii=ensure_ascii,encoding=encoding, **kwargs)
    

    where SYSTEM_ENCODING is set to: 其中SYSTEM_ENCODING设置为:

    locale.setlocale(locale.LC_ALL, '')
    SYSTEM_ENCODING = locale.getlocale()[1]
    
    展开全文
  • MySQL 字符集utf8utf8mb3、utf8mb4

    千次阅读 2018-06-26 17:07:39
    | utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 | | cp1251 | Windows Cyrillic | cp1251_general_ci | 1 | | utf16 | UTF-16 Unicode | utf16_general_ci | 4 | | utf16le | UTF-16LE Unicode | utf16le_...

    首先想要了解MySQL的字符集,就需要去官方文档看看字符集是如何介绍的。英语不错的话,看官方文档应该是没问题。在搜索框里搜一下就可以找到相关的解释。我就在这里整理一下,以便后期查看。字符集在官方文档下面这一章节:
    Chapter 10 Character Sets, Collations, Unicode

    https://dev.mysql.com/doc/refman/5.6/en/charset.html



    一、字符集设置


    MySQL数据库可以做到:
    1、使用多种字符集存储字符串。
    2、使用多种排序规则比较字符串。
    3、在同一服务器、同一数据库、甚至同一表中混合具有不同字符集或排序规则的字符串。
    4、在任何级别启用字符集和排序规则的规范。

    MySQL可以设置如下40种字符:
    mysql> SHOW CHARACTER SET;
    +----------+-----------------------------+---------------------+--------+
    | Charset  | Description                 | Default collation   | Maxlen |
    +----------+-----------------------------+---------------------+--------+
    | big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
    | dec8     | DEC West European           | dec8_swedish_ci     |      1 |
    | cp850    | DOS West European           | cp850_general_ci    |      1 |
    | hp8      | HP West European            | hp8_english_ci      |      1 |
    | koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
    | latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |
    | latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |
    | swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |
    | ascii    | US ASCII                    | ascii_general_ci    |      1 |
    | ujis     | EUC-JP Japanese             | ujis_japanese_ci    |      3 |
    | sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |      2 |
    | hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |
    | tis620   | TIS620 Thai                 | tis620_thai_ci      |      1 |
    | euckr    | EUC-KR Korean               | euckr_korean_ci     |      2 |
    | koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |      1 |
    | gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |      2 |
    | greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |
    | cp1250   | Windows Central European    | cp1250_general_ci   |      1 |
    | gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |
    | latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |
    | armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |      1 |
    | utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 |
    | ucs2     | UCS-2 Unicode               | ucs2_general_ci     |      2 |
    | cp866    | DOS Russian                 | cp866_general_ci    |      1 |
    | keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |      1 |
    | macce    | Mac Central European        | macce_general_ci    |      1 |
    | macroman | Mac West European           | macroman_general_ci |      1 |
    | cp852    | DOS Central European        | cp852_general_ci    |      1 |
    | latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |      1 |
    | utf8mb4  | UTF-8 Unicode               | utf8mb4_general_ci  |      4 |
    | cp1251   | Windows Cyrillic            | cp1251_general_ci   |      1 |
    | utf16    | UTF-16 Unicode              | utf16_general_ci    |      4 |
    | utf16le  | UTF-16LE Unicode            | utf16le_general_ci  |      4 |
    | cp1256   | Windows Arabic              | cp1256_general_ci   |      1 |
    | cp1257   | Windows Baltic              | cp1257_general_ci   |      1 |
    | utf32    | UTF-32 Unicode              | utf32_general_ci    |      4 |
    | binary   | Binary pseudo charset       | binary              |      1 |
    | geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |      1 |
    | cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |      2 |
    | eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |      3 |
    +----------+-----------------------------+---------------------+--------+

    40 rows in set (0.00 sec)


    String expressions have a repertoire attribute, which can have two values:

    • ASCII: The expression can contain only characters in the Unicode range U+0000 to U+007F.

    • UNICODE: The expression can contain characters in the Unicode range U+0000 to U+10FFFF. This includes characters in the Basic Multilingual Plane (BMP) range (U+0000 to U+FFFF) and supplementary characters outside the BMP range (U+10000 to U+10FFFF).

    这里提到:Basic Multilingual Plane (BMP) 和 supplementary characters
      Basic Multilingual Plane (BMP):基本多文种平面
      Supplementary Multilingual Plane(SMP):多文种补充平面
      BMP就已经包含常用字符,而SMP只是一些不常用的字符,代码点(字符)。如Emoji头像的符号,扑克牌的符号等等。
      关于BMP与SMP详细可以查看wiki上的解释:https://en.wikipedia.org/wiki/Plane_(Unicode)


      系统默认设置元数据表的字符集为utf8,是通过参数character_set_system设置。character_set_results这个参数默认是utf8,当查询表数据返回给客户端,这个参数是控制返回的结构数据的字符集。如果希望服务器将元数据结果传递回不同的字符集,请使用SET NAMES语句强制服务器执行字符集转换。客户端程序可以在接收到来自服务器的结果后执行转换。客户端执行转换更为有效,但此选项并不总是适用于所有客户端。


    SET NAMES 'utf8';

    There are default settings for character sets and collations at four levels: server, database, table, and column.

    _ai

    Accent insensitive   重音不敏

    _asAccent sensitive     重音敏感
    _ciCase insensitive    不区分大小写
    _cscase-sensitive      区分大小写

    _bin

    Binary            二进制

    设置了_ci顾名思义显式不区分大小写,隐式重音不敏感。

    设置了_cs,顾名思义_as也是包含的,显式区分大小写,隐式重音敏感。

    设置MySQL server character参数如下:

    character-set-server

    方法一:

     mysqld 
       mysqld --character-set-server=latin1 
        mysqld --character-set-server=latin1 \ 

          --collation-server=latin1_swedish_ci

    方法二:

         cmake . -DDEFAULT_CHARSET=latin1
           或cmake . -DDEFAULT_CHARSET=latin1 \ 
              -DDEFAULT_COLLATION=latin1_german1_ci

    The current server character set and collation can be determined from the values of the character_set_server and collation_server system variables. These variables can be changed at runtime.

    二、Database Character Set and Collation

    CREATE DATABASE db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name] 
       ALTER DATABASE db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name]

       The keyword SCHEMA can be used instead of DATABASE.

       All database options are stored in a text file named db.opt that can be found in the database directory.

       The CHARACTER SET and COLLATE clauses make it possible to create databases with different character sets and collations on the same MySQL server.

       查看你数据库这两个参数设置:
       USE db_name; 
       SELECT @@character_set_database, @@collation_database;


    三、Table Character Set and Collation

    The CREATE TABLE and ALTER TABLE statements have optional clauses for specifying the table character set and collation:
    CREATE TABLE tbl_name (column_list) [[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]] 
    ALTER TABLE tbl_name [[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]

      四、Column Character Set and Collation

    Every “character” column (that is, a column of type CHAR, VARCHAR, or TEXT) has a column character set and a column collation. Column definition syntax for CREATE TABLE and ALTER TABLE has optional clauses for specifying the column character set and collation:

    col_name {CHAR | VARCHAR | TEXT} (col_length) [CHARACTER SET charset_name] [COLLATE collation_name]
    col_name {ENUM | SET} (val_list) [CHARACTER SET charset_name] [COLLATE collation_name]

      五、Character String Literal Character Set and Collation

    For the simple statement SELECT 'string', the string has the connection default character set and collation defined by the character_set_connection and collation_connection system variables.

    A character string literal may have an optional character set introducer and COLLATE clause, to designate it as a string that uses a particular character set and collation:
    [_charset_name]'string' [COLLATE collation_name]

    Examples:
    SELECT 'abc'; 
    SELECT _latin1'abc'; 
    SELECT _binary'abc'; 
    SELECT _utf8'abc' COLLATE utf8_danish_ci;


      六、The National Character Set

    Standard SQL defines NCHAR or NATIONAL CHAR as a way to indicate that a CHAR column should use some predefined character set. MySQL usesutf8 as this predefined character set. For example, these data type declarations are equivalent:

    CHAR(10) CHARACTER SET utf8 
    NATIONAL CHARACTER(10) 
    NCHAR(10)

    As are these:
    VARCHAR(10) CHARACTER SET utf8 
    NATIONAL VARCHAR(10) 
    NVARCHAR(10) 
    NCHAR VARCHAR(10) 
    NATIONAL CHARACTER VARYING(10) 
    NATIONAL CHAR VARYING(10)


      七、Character Set Introducers


    A character string literal, hexadecimal literal, or bit-value literal may have an optional character set introducer and COLLATE clause, to designate it as a string that uses a particular character set and collation:

    [_charset_name] literal [COLLATE collation_name]

    Character set introducers and the COLLATE clause are implemented according to standard SQL specifications.

    Examples:
    SELECT 'abc'; 
    SELECT _latin1'abc'; 
    SELECT _binary'abc'; 
    SELECT _utf8'abc' COLLATE utf8_danish_ci; 

    SELECT _latin1 X'4D7953514C';          --16进制
    SELECT _utf8 0x4D7953514C COLLATE utf8_danish_ci; 

    SELECT _latin1 b'1000001';            --2进制
    SELECT _utf8 0b1000001 COLLATE utf8_danish_ci;


    八、Unicode Support


    BMP characters have these characteristics:

    • Their code point values are between 0 and 65535 (or U+0000 and U+FFFF).

    • They can be encoded in a variable-length encoding using 8, 16, or 24 bits (1 to 3 bytes).

    • They can be encoded in a fixed-length encoding using 16 bits (2 bytes).

    • They are sufficient for almost all characters in major languages.

    Supplementary characters lie outside the BMP:

    • Their code point values are between U+10000 and U+10FFFF).

    • Unicode support for supplementary characters requires character sets that have a range outside BMP characters and therefore take more space than BMP characters (up to 4 bytes per character).


    The UTF-8 (Unicode Transformation Format with 8-bit units) method for encoding Unicode data is implemented according to RFC 3629, which describes encoding sequences that take from one to four bytes. The idea of UTF-8 is that various Unicode characters are encoded using byte sequences of different lengths:

    • Basic Latin letters, digits, and punctuation signs use one byte.

    • Most European and Middle East script letters fit into a 2-byte sequence: extended Latin letters (with tilde, macron, acute, grave and other accents), Cyrillic, Greek, Armenian, Hebrew, Arabic, Syriac, and others.

    • Korean, Chinese, and Japanese ideographs use 3-byte or 4-byte sequences.

    MySQL supports these Unicode character sets:

    • utf8mb4: A UTF-8 encoding of the Unicode character set using one to four bytes per character.

    • utf8mb3: A UTF-8 encoding of the Unicode character set using one to three bytes per character.

    • utf8: An alias for utf8mb3.

    • ucs2: The UCS-2 encoding of the Unicode character set using two bytes per character.

    • utf16: The UTF-16 encoding for the Unicode character set using two or four bytes per character. Like ucs2 but with an extension for supplementary characters.

    • utf16le: The UTF-16LE encoding for the Unicode character set. Like utf16 but little-endian rather than big-endian.

    • utf32: The UTF-32 encoding for the Unicode character set using four bytes per character.


    下面这张表统计字符集字节数:

    Character SetSupported CharactersRequired Storage Per Character
    utf8mb3utf8BMP only1, 2, or 3 bytes
    ucs2BMP only2 bytes
    utf8mb4BMP and supplementary1, 2, 3, or 4 bytes
    utf16BMP and supplementary2 or 4 bytes
    utf16leBMP and supplementary2 or 4 bytes
    utf32BMP and supplementary4 bytes


    九、utf8(utf8mb3)与utf8mb4的转换


    10.9.8 Converting Between 3-Byte and 4-Byte Unicode Character Sets

    The utf8mb3 and utf8mb4 character sets differ as follows:

    utf8mb3 supports only characters in the Basic Multilingual Plane (BMP). utf8mb4 additionally supports supplementary characters that lie outside the BMP.

    Note

    This discussion refers to the utf8mb3 and utf8mb4 character set names to be explicit about referring to 3-byte and 4-byte UTF-8 character set data. The exception is that in table definitions, utf8 is used because MySQL converts instances of utf8mb3specified in such definitions to utf8, which is an alias for utf8mb3.


    utf8mb4与utf8(utf8mb3)转换也是特别好转换的:

    1.utf8(utf8mb3)转成utf8mb4可以存储supplementary characters;

    2.utf8(utf8mb3)转成utf8mb4可能会增加数据存储空间;

    3.对于BMP character字符,utf8(utf8mb3)转成utf8mb4相同的代码值、相同的编码、相同的长度,不会有变化。

    4.对于supplementary character字符,utf8mb4会以4字节存储,由于utf8mb3无法存储supplementary character字符,因而在字符集转换过程中,不用担心字符无法转换的问题。

    5.表结构在转换过程中需要调整:utf8(utf8mb3)字符集可变长度字符数据类型(VARCHAR和text类型)设定的表中列的字段长度,utf8mb4中将会存储更少的字符。对于所有字符数据类型(CHAR、VARCHAR和文本类型),UTF8Mb4列最多可被索引的字符数比UTF8Mb3列要少。因此在转换之前,要检查字段类型。防止转换后表,索引存储的数据超出该字段定义长度,字段类型长度可以存储的最大字节数。innodb索引列:最大索引列长度767 bytes,对于utf8mb3就是可以索引255个字符,对于utf8mb4就是可以索引191个字符。在转换后不能满足那么就需要换一个列来索引。以下是通过压缩方式使索引更多的字节

    Note:

    For InnoDB tables that use COMPRESSED or DYNAMIC row format, you can enable the innodb_large_prefix option to permit index key prefixes longer than 767 bytes (up to 3072 bytes). Creating such tables also requires the option valuesinnodb_file_format=barracuda and innodb_file_per_table=true.) In this case, enabling the innodb_large_prefixoption enables you to index a maximum of 1024 or 768 characters for utf8mb3 or utf8mb4 columns, respectively. For related information, see Section 14.8.1.7, “Limits on InnoDB Tables”.


    The preceding types of changes are most likely to be required only if you have very long columns or indexes. Otherwise, you should be able to convert your tables from utf8mb3 to utf8mb4 without problems, using ALTER TABLE as described previously.


    6.应用于MySQL server 字符集也需要一一对应。

    7.master 实例改变字符集,那么slave也需要相应的改变。



    展开全文
  • lua utf8 unicode ansi 转换

    热门讨论 2012-03-06 00:40:57
    require "lc" print(lc.help());... u2w(utf8 to unicode) w2a(unicode to ansi) w2u(unicode to utf8) u2a(utf8 to ansi) a2u(ansi to utf8) bstr(bytes of str) help(show this) wunoman@qq.com 2012/03/06
  • c语言gbk、utf8转换编码表及函数

    热门讨论 2013-08-28 08:51:52
    c语言的gbk和unicode的编码对照表以及gbk和utf8的相互转换函数(比较全)。
  • MySQL数据库字符集utf8如何转utf8mb4

    万次阅读 2019-05-07 17:08:48
    这几天开发的项目需要把Emoji 表情保存到数据库,原来的Mysql数据库的编码是utf8的,这就导致保存的时候报如下错误: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x95\xF0\x9F...' for column...

           这几天开发的项目需要把Emoji 表情保存到数据库,原来的Mysql数据库的编码是utf8的,这就导致保存的时候报如下错误:

    java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x95\xF0\x9F...' for column…………

           mysql的utf8并不是真正意义上的utf8,mysql的utf8只支持最长三个字节,所以Emoji 表情和有些生僻字以及任何新增的 Unicode 字符等如果超过三个字节用utf8字符集保存是会报错的。mysql在5.5.3之后增加了utf8mb4这个字符集,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。

           为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8.  对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR  替代 CHAR。

           因为mysql的char列类型在utf8mb4下, 为了保证所有的数据都存的下, char将会占用字符数*4的字节数 (mysql的char列类型utf8将占用字符数*3的字节数), 以保证空间分配足够. 所以建议用可变长度varchar, 以节省空间. 可变长度消耗的存储空间为: 实际存储需要的字节数+1或2个字节表达的长度。

            使用utf8mb4要求:

    1.MySQL版本要求:不低于5.5.3(mysql是在5.5.3之后增加了utf8mb4这个字符集)
    2.JDBC驱动版本要求:mysql connector版本高于5.1.13

            可以使用如下sql查看数据库及服务器的字符集/编码集情况:

    show variables like '%character%';
    show variables like 'collation%';
    

             

          将数据库和已经建好的表也转换成utf8mb4

              更改数据库编码(字符集):ALTER DATABASE DATABASE_NAME  DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

              更改表编码(字符集)(注意:这里修改的是表的字符集,表里面字段的字符集并没有被修改):ALTER TABLE TABLE_NAME DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 

              更改表编码(字符集)和表中所有字段的编码(字符集):

    ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

     

    批量修改表和表字段编码的方法:

    MySQL批量修改数据表的字符集:https://blog.csdn.net/vfsdfdsf/article/details/90287305

    MySQL批量修改数据表和数据表中所有字段的字符集:https://blog.csdn.net/vfsdfdsf/article/details/90484891

     

    修改字符集为utf8mb4的sql语句如下(下面的语句只对当前session有效,是临时性的,永久性的请修改MySQL配置文件)

    /*来自客户端的语句的字符集*/
    set character_set_client = utf8mb4;
    /*建立连接使用的字符集*/
    set character_set_connection = utf8mb4;
    /*默认数据库使用的字符集。当默认数据库更改时,服务器则设置该变量。如果没有默认数据库,变量的值同character_set_server*/
    set character_set_database = utf8mb4;
    /*用于向客户端返回查询结果的字符集*/
    set character_set_results = utf8mb4;
    /*服务器的默认字符集*/
    set character_set_server=utf8mb4;
    

         

         修改MySQL配置文件

                      (修改MySQL配置文件是后面操作另外一个库的时候补充上来的,所以这里的utf8mb4_unicode_ci和下面截图中的utf8mb4_general_ci,有不一致的地方,朋友们根据自己的需求设置就是了。utf8mb4_unicode_ci和utf8mb4_general_ci的区别只是排序规则的不同,字符集都是utf8mb4,排序规则根据自身需求选择即可)

                      修改mysql配置文件my.cnf(windows为my.ini,我的windows下my.ini文件在C:\ProgramData\MySQL\MySQL Server 5.7目录) 
                      我的my.cnf放在/etc/my.cnf位置。找到后请在以下三部分里添加如下内容:

                      [client]
                      default-character-set = utf8mb4
                      [mysql]
                      default-character-set = utf8mb4
                      [mysqld]
                      character-set-client-handshake = FALSE
                      character-set-server = utf8mb4
                      collation-server = utf8mb4_unicode_ci
                      init_connect='SET NAMES utf8mb4'

                      截图如下(最后一句是忽略表名大小写的,有需要的可以配置上):

                             

     

           修改完成后记得重启mysql:       

           Linux:

    service mysql restart
    或者
    service mysqld restart

           Windows:

    net stop mysql
    
    net start mysql

                             停止命令:net stop mysql

                             启动命令:net start mysql

    不同的操作系统重启数据库方式不同,如果以上命令不管用,请根据操作系统在网上搜索命令

     

     

    修改前的数据库和服务器字符集我没有截图保存,下面贴上修改后的截图

    下面贴上上面各个参数的解释:

    character_set_client
    来自客户端的语句的字符集。
    
    
    character_set_connection
    建立连接使用的字符集。
    
    
    character_set_database
    默认数据库使用的字符集。当默认数据库更改时,服务器则设置该变量。如果没有默认数据库,变量的值同character_set_server
    
    
    character_set_results
    用于向客户端返回查询结果的字符集。
    
    
    character_set_ server
    服务器的默认字符集。
    
    
    character_set_system
    服务器用来保存识别符的字符集。该值一定是utf8。
    
    
    character_sets_dir
    字符集安装目录。
    
    
    collation_connection
    连接字符集的校对规则。
    
    
    collation_database
    默认数据库使用的校对规则。当默认数据库改变时服务器则设置该变量。如果没有默认数据库,变量的值同collation_server。
    
    
    collation_server
    服务器的默认校对规则。
    

    程序重新连接数据库,应该是可以保存成功了。

     

    如果修改完成后,代码中保存还是报错的话那就要修改连接数据库的配置了。

    本人使用的是阿里巴巴的druid数据库连接池:

    我在DruidDataSource配置中新增了如下配置:

    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" abstract="true">
        <!-- 其他的与本次换字符集无关的配置我就不贴上来了 -->
        <!-- 物理连接初始化的时候执行的sql -->
        <property name="connectionInitSqls" value="set names utf8mb4;"/>
    </bean>

    jdbc数据库连接参数设置:
    删除了如下参数:useUnicode\=true&characterEncoding\=utf-8


    characterEncoding=utf8其实是会自动识别为utf8mb4,也可以不加这个参数,会自动检测。 
    而autoReconnect=true是必须加上的。

     

    如果本文有什么错误的地方烦请指出!

    如果有问题可以留言,希望本文可以帮助有需要的人。

    记得点赞哟!

     

     

    展开全文
  • 官方文档:MySQL 8.0 Reference Manual: 10.9.2 The utf8mb3 Character Set (3-Byte UTF-8 Unicode Encoding) 首先,上结论: 国际上的UTF-8,在MySQL中,对标的是uft8mb4。 在MySQL中,实际只有utf8mb4和utf8mb3...
  • 数据库字符集utf8utf8mb4的详细区别

    千次阅读 2019-04-17 21:01:57
    最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误: Incorrectstringvalue:‘\xF0\x9F\x98\x83<…’forcolumn‘summary’at row1我用的是UTF-8...
  • 全面了解mysql中utf8utf8mb4的区别

    千次阅读 2018-10-08 17:34:23
    好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。 二.内容描述  那上面说了既然utf8能够存下大部分中文汉字,那为什么还要...
  • utf8utf8mb4的区别

    千次阅读 2020-04-18 13:02:10
    我们新建mysql数据库的时候,需要指定数据库的字符集,一般我们都是选择utf8这个字符集,但是还会又一个utf8mb4这个字符集,好像和utf8有联系,今天就来解析一下这两者的区别。 二、起源 MySQL在5.5.3之后增加了这...
  • oracle 字符集 AL32UTF8UTF8

    千次阅读 2019-08-25 21:11:18
    因此,如果数据库版本都在9i及其以上,不需要考虑ORACLE8的数据库,建议使用AL32UTF8字符集,它采用的Unicode标准要比UTF8采用的Unicode标准更新,支持的字符也更多一些。如果要考虑ORACLE8数据库,建议使用UTF8字符...
  • 文本文件编码转换工具 gbk utf8 gb2312

    千次下载 热门讨论 2010-01-26 18:27:23
    问题也是有的,在此环境下涉及到数据库运行的文件都必须是 utf8编码.这样一来就出现了不兼容,因为在国内大家都是以GBK gb2312编的码 包括 17PHP.com 网站里的学习源码文件(我用的是77例中的) 和很多插件 论坛代码......
  • 明确Unicode,UTF-8,string,wstring概念,以及locale name之前, 先简单了解两个概念 字符集: 为每一个字符(asic,中文,日文,俄文等)分配一个唯一的ID(又称码位)。 编码规则:将码位转换为字节序列的规则...
  • UTF8、UTF16、UTF32区别

    千次阅读 2019-04-10 22:19:30
    UTF8、UTF16、UTF32区别
  • utf8mb4 已成为 MySQL 8.0 的默认字符集,在MySQL 8.0.1及更高版本中将 utf8mb4_0900_ai_ci 作为默认排序规则。 新项目只考虑 utf8mb4 UTF-8 编码是一种变长的编码机制,可以用1~4个字节存储字符。 因为历史遗留问题...
  • mysql使用utf8mb4经验吐血总结

    万次阅读 多人点赞 2019-09-26 15:09:02
    mysql使用utf8mb4经验吐血总结 1. utf8utf8mb4 异同 先看 官方手册 https://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8mb4.html 的说明: The character set named utf8 uses a maximum of three ...
  • 如果你要存互联网emoji表情,例如昵称,聊天,就需要utf8mb4,而不是utf-8。 MySQL数据库的 “utf8”并不是真正概念里的UTF-8。 首先确实utf8需要超过3个字节的长度。其次目前可见字符集都只需要3个字节,包含了...
  • MySQL中 utf8utf8mb4区别

    千次阅读 2019-08-08 19:52:52
    utf8utf8mb4区别
  • 存储字符集 utf8utf8mb4 utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8 字符,也就是 Unicode 中的基本多文本平面。 要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但...
  • python用mysql建表的UTF8MB3、UTF8MB4警告

    千次阅读 2018-11-18 22:56:31
    今天想练习下myslq的数据库索引,看的教程是...# -*- coding: utf-8 -*- &amp;amp;quot;&amp;amp;quot;&amp;amp;quot; @Author: P♂boy @License: (C) Copyright ...
  • 数据库编码,从utf8转到utf8mb4

    千次阅读 2019-04-03 16:04:13
    如果UTF8字符集且是Java服务器的话,当存储含有emoji表情时,会抛出类似如下异常: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1 at ...
  • Go语言---unicode/utf8 unicode/utf16包

    千次阅读 2018-05-10 11:22:10
    unicode/utf8utf8实现了函数和常量来支持UTF-8编码的文本。它包括在runes和UTF-8字节序列之间转换的函数。utf8里面的函数就有一些字节和字符的转换。//判断是否符合UTF编码的函数 // Valid 判断 p 是否为完整有效...
  • mysql的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本...
  • mysql字符集utf8mb4失效踩坑

    万次阅读 2019-08-17 17:39:13
    mysql数据表的字符集已经设置成了utf8mb4,但是通过JDBC向数据库写入4字节的emoji表情时报错,但是通过直接使用命令行插入该4字节的emoji表情时却成功了。示例如下: CREATE TABLE `user_info` ( `id` int(11) NOT ...
  • mysql字符集 utf8utf8mb4 的区别

    万次阅读 多人点赞 2019-05-09 10:53:26
    我们新建mysql数据库的时候,需要指定数据库的字符集,一般我们都是选择utf8这个字符集,但是还会又一个utf8mb4这个字符集,好像和utf8有联系,今天就来解析一下这两者的区别。 二、起源 MySQL在5.5.3之后增加了这个...
  • UTF8UTF8 +BOM 区别

    万次阅读 2016-07-15 16:48:34
    由于兼容性,带BOM的utf-8在一些browser中显示为乱码。 网上搜索了关于Byte Order Mark的信息: 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,942,280
精华内容 1,576,912
关键字:

utf8