y字符集丁海龙

• MySQL提供了多种字符集和排序规则选择,其中字符集设置和数据存储以及客户端与MySQL实例的交互相关,排序规则和字符串的对比规则相关• 字符集的设置可以为MySQL实例、数据库、表、列四个级别• MySQL设置字符集支持在InnoDB, MyISAM, Memory三个存储引擎

1 字符集和排序规则简介

• 排序规则的命令通常是以对应的字符集的名字为开头,并以自己的特定属性结尾,比如排序规则utf8_general_ci和latin1_swedish_ci就分别是对应utf8和latin1字符集的排序规则• 当排序规则特指某种语言时,则中间的部分就为这种语言的名字,比如utf8_turkish_ci和utf8_hungarian_ci就代表UTF8字符集中的土耳其语和匈牙利语

• 默认情况下的字符集

• 在默认下创建的表默认字符集:

• ASCII码(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语• ASCII的局限在于只能显示26个基本拉丁字母、阿拉伯数目字和英式标点符号,因此只能用于显示现代美国英语(而且在处理英语当中的外来词如naïve、café、élite等等时,所有重音符号都不得不去掉,即使这样做会违反拼写规则)• Latin字符集:ISO 8859-1,正式编号为ISO/IEC 8859-1:1998,又称Latin-1或“西欧语言”,是国际标准化组织内ISO/IEC 8859的第一个8位字符集。它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入96个字母及符号,藉以供使用附加符号的拉丁字母语言使用• 此字符集支持部分于欧洲使用的语言,包括阿尔巴尼亚语、巴斯克语、布列塔尼语、加泰罗尼亚语、丹麦语、荷兰语、法罗语、弗里西语、加利西亚语、德语、格陵兰语、冰岛语、爱尔兰盖尔语、意大利语、拉丁语、卢森堡语、挪威语、葡萄牙语、里托罗曼斯语、苏格兰盖尔语、西班牙语及瑞典语。

• Latin1是一种很常见的字符集,这种字符集是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。很明显,Latin1覆盖了所有的单字节,因此,可以将任意字符串保存在latin1字符集中,而不用担心有内容不符合latin1的编码规范而被抛弃。——gbk和utf8是多字节编码,没有这种特性。• mysql使用者经常利用Latin1的这种全覆盖特性,将其它类型的字符串,gbk,utf8,big5等,保存在latin1列中。保存的过程中没有数据丢失,只要原样取出来,便又是合法的gbk/utf8/big字符串。如果将gbk字符串保存在utf8列中,则gbk字符串中那些不符合utf8编码格式的内容,会被抛弃,保存的内容无法原样取出,数据实际上遭到了破坏。• 综上,如果我们看到一个字段的字符集是latin1的,那么,他保存的可能是任何编码的字符串• 所谓单字节编码就是挨着一个个来,比如圣诞节到了,你要送妹子一箱苹果,为制造浪漫,商铺提供两种包装方式,一是按个数来,即单个苹果包装进一个盒子,来一个包装一个,这样,妹子在拆完所有的盒子后完完整整的可以还原为一个个完整的和一箱完好无损的苹果,二是按重量来,每个盒子限重2两、3两、6两,这样在包装时,若刚好重3两的当然可以完整的放进一个盒子,但是若不够或者多了,勉不了要切开苹果,或者再往盒子中添加其他的部分苹果,这样的话,妹子再无论怎样拆开盒子,都会得到一箱残缺不堪的苹果了,因为你在按照这种包装方式进行时,已经破坏了单个苹果的完整性,现在还原不回来了~我们的字符集编码转换就是在做这种重新包装的工作,latin1恰好就像单个苹果包装,而utf8就像第二种方式。

• 实例级别的字符集可以在实例启动的时候指定,默认的字符集是latin1,可以通过--character-set-server参数指定实例的字符集,通过--collation-server参数指定实例的排序规则• 当仅指定了字符集没有指定排序规则时,则默认的排序规则是该字符集的默认排序规则• 以下三个启动实例的方式的设置效果是一样的:

• 指定实例级别的字符集的作用是当create database语句中没有指定字符集,则创建的数据库默认是该字符集和排序规则• 可以通过MySQL系统变量查看实例的字符集和排序规则,变量名分别是character_set_server和collation_server

3 表级别字符集和排序规则• 每个表都有自己的字符集和排序规则,可以通过create table和alter table语句指定或修改表的字符集和排序规则•   CREATE TABLE t1 ( ... ) CHARACTER SET latin1 COLLATE latin1_danish_ci;• 当创建和修改表时没有指定排序规则时,会使用字符集默认的排序规则• 当创建和修改表时没有指定字符集,则使用排序规则对应的字符集• 当两个属性都没有指定时,会使用数据库级别的字符集和排序规则

4 列级别字符集和排序规则• 每个字符串字段(char, varchar, text)都有自己的字符集和排序规则,可以通过create table和alter table指定和修改字段的字符集和排序规则

• 同样,当字段上只指定了字符集时,排序规则会使用该字符集对应的默认排序规则• 当字段上只指定了排序规则时,则字符集会使用对应的字符集• 当字段上两者都没有定义时,则使用表级别的字符集和排序规则

5 字符串的字符集和排序规则• 对于在SQL语句中出现的字符串,也会有自己的字符集和排序规则,通常是由character_set_connection和collation_connection两个系统参数决定的• 也可以显示指定字符串的字符集和排序规则

• 当charset和collation都指定时,使用这两者作为字符串的字符集和排序规则• 当仅指定charset时,则排序规则使用该字符集对应的默认排序规则• 当仅指定排序规则时,则使用character_set_connection参数对应的字符集,且必须保证排序规则是字符集允许的• 当两者都没有指定时,则使用character_set_connection和collation_connection两个参数指定的字符集和排序规则• 比如SELECT _utf8'Müller';会使用utf8字符集和默认的utf8_general_ci排序规则• 比如SELECT 'Müller' COLLATE utf8_general_ci;会使用系统连接的字符集,但如果字符集不是utf8就会报错

6 国家字符集• 标准SQL中会有两种预定义的字符集数据类型,分别是nchar和nvarchar。 在MySQL中这种预定义的字符集就是UTF8,所以以下定义的最终结果是相同的:

7 连接级字符集和排序规则• 每个数据库客户端连接都有自己的字符集和排序规则属性,  客户端发送的语句的字符集是由character_set_client决定,  而与服务端交互时会根据character_set_connection和collation_connection两个参数将接收到的语句转化。  当涉及到显示字符串的比较时,由collation_connection参数决定,而当比较的是字段里的字符串时则根据字段本身的排序规则决定• character_set_result参数决定了语句的执行结果以什么字符集返回给客户端

8 应用程序配置字符集和排序规则• 当应用程序使用MySQL默认的字符集和排序规则时,则应用程序端不需要特别的设置,而当不是使用默认属性时则需要特别设置。  比如我们可以灵活的的为每一个数据库设置不同的字符集和排序规则,对应用程序来说就可以通过set names命令与所操作的数据库保持一致;  在服务器端我们可以通过设置--character_set_server和--collation_server两个参数来指定实例的默认字符集和排序规则,并将此作为每个数据库和表的默认字符集和排序规则,比如:

• 而在应用程序端,也需要通过set names命令保证每个数据库链接和数据库保持一致

• 我们也可以通过参数 --init_connect="SET NAMES 'utf8'" 来让每个客户端连接都自动设置字符集,但缺点是对拥有super权限的用户不生效• init_connect表示服务器为每个连接的客户端执行的字符串。字符串由一个或多个SQL语句组成。要想指定多个语句,用分号间隔开

• 我们也可以通过参数 --init_connect="SET NAMES 'utf8'" 来让每个客户端连接都自动设置字符集,但缺点是对拥有super权限的用户不生效• init_connect表示服务器为每个连接的客户端执行的字符串。字符串由一个或多个SQL语句组成。要想指定多个语句,用分号间隔开

9 排序规则在SQL中的使用

首先计算每种情况的排序规则权重:1. 当有显示的写明优先级的,则权重为02. 当两个有不同排序规则的字符串连接在一起的,则权重为13. 字段和本地参数的排序规则,权重为24. 由部分字符串函数返回的系统常量所带的排序规则,权重为35. 字符串自带的排序规则,权重为4......在最终选择使用哪种排序规则上,规则为:1. 优先使用权重最低的2. 如果两者拥有相同的优先级,则   1)如果两者都是Unicode,或者都不是Unicode,则返回错误   2)如果一边是Unicode而另一边不是,则将不是Unicode的一边转化成Unicode字符集,      比如:SELECT CONCAT(utf8_column, latin1_column) FROM t1;      latin1字符集的列会自动转化为utf8的字符集,再执行字符串连接   3)当两边都是相同字符集,且一边是_bin而另一边是_ci/_cs的排序规则时,则使用_bin的排序规则

我们不能比较两个属于不同校对的不同字符值

10  Unicode字符集Unicode(Universal Code)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode存在不同的编码方案,包括Utf-8,Utf-16和Utf-32。Utf表示Unicode Transformation Format。

• MySQL支持的Unicode字符集包括以下几种:

大多数的Unicode字符集都会一个一般意义上的排序规则,比如以_general结尾命名,以_bin命名的二进制排序规则,当然也有指定特定语言的排序规则• 比如在“Classical Latin”的排序规则中, I和J的对比结果是相等的, 而U和V的对比结果也是相等的

11 不同字符集下字符空间消耗

其中M在非二进制字段中代表定义的字符长度数值,L代表真实的字符所占用的字节数当定义varchar字段时,最大的长度为65553个字节,且这个最大长度是整行数据共享的限制,。当存储比如Latin字符集时,每个字节存储一个字符,而当在多字节字符集比如UTF8时,由于每个字符最大要求3个字节的存储,所以字段的最大创建长度就是21844个字符

12 MySQL字符集参数查看当前数据库字符集

查看当前数据库字符集校对

在启动参数前指定

临时指定

又比如向默认字符集为latin1的数据表插入utf8编码的数据前设置了连接字符集为utf8插入时根据连接字符集设置,character_set_client、character_set_connection和character_set_results均为utf8;插入数据将经过utf8=>utf8=>latin1的字符集转换,若原始数据中含有\u0000~\u00ff范围以外的Unicode字符,会因为无法在latin1字符集中表示而被转换为“?”(0×3F)符号,以后查询时不管连接字符集设置如何都无法恢复其内容了

15 乱码终极解决方案1.首先要明确你的客户端时候何种编码格式,这是最重要的(IE6一般用utf8,命令行一般是gbk,一般程序是gb2312)2.确保你的数据库使用utf8格式,很简单,所有编码通吃。3.一定要保证connection字符集大于等于client字符集,不然就会信息丢失,比如: latin1 < gb2312 < gbk < utf8,若设置set character_set_client = gb2312,那么至少connection的字符集要大于等于gb2312,否则就会丢失信息4.以上三步做正确的话,那么所有中文都被正确地转换成utf8格式存储进了数据库,为了适应不同的浏览器,不同的客户端,你可以修改character_set_results来以不同的编码显示中文字体,由于utf8是大方向,因此web应用还是倾向于使用utf8格式显示中文的。

THE END
0.字母大小写转换拼音大小写转换英文大写转小写,英文小写转大写,在线英文字母大小写转换,首字母大写转换工具jvzquC41|ojyz7ozilz{0lto1
1.英文大小写转换英文大小写转换器可以帮助您快速转换英文字母的大小写格式。它支持将所有字母转换为大写或小写,将每个单词的首字母转换成大写,或者将每句首字母改成大写,以及转换为标题大小写格式。同时还支持英文字数统计。这个大小写转换器工具非常适用于需要快速更改文本格式的情况,例如在撰写电子邮件或文档时。 英文大小写转换器如何jvzquC41yy}/fj}kcq~jg7hqo0io1lfug/ippjtv1
2.字母大小写转换在线英文字母大小写转换工具iP138在线工具程序上的字母大小写转换函数 1、PHP:strtolower($str) 字符串转换为小写,strtoupper($str) 字符串转换为大写;ucfirst($str) 将第一个字符转换为大写,ucwords($str) 将每个单词的首字母转换为大写。 2、JavaScript:toLowerCase()返回一个字符串,其中所有的字母字符都被转换为小写;tojvzquC41vqum0ru35:4dqv4ngvzft8
3.蓝桥杯:大小写转换(异或转换)使用异或求转换大小写蓝桥杯:大小写转换(异或转换) 一、题目要求 输入一个字符串,将其中的大写字母转换为小写字母,小写字母转换为大写字母,其他字符不变,输出转换后的字符。 示例: 输入:Aa/.+-a 输出:aA/.+-A 二、代码展示 public static void main(String[] args) {jvzquC41dnuh0lxfp0tfv87523e8;?5223;0c{ykenk0fnyckny03=:5:2?42
4.掌握这几个函数,轻松搞定Python大小写字母转换!本文介绍了Python中处理大小写字母的几种常见方法,包括`upper()`、`lower()`、`capitalize()`、`title()`和`swapcase()`,并提供了使用ASCII表进行转换的示例。同时,文章还分享了Python学习路线、工具、视频教程和实战练习等内容。 python大小写字母转换的方法有好几种,掌握以下这些字符串函数,就可以轻松搞定所有大jvzquC41dnuh0lxfp0tfv8r2a7?35?;241gsvrhng1jfvjnnu1748;8559:
5.英文字母大小写转换英文大写转小写首页>英文字母大小写转换 (提示:请把你需要转换的内容粘贴在这里!) 关于英文字母 英文字母,即英文(English)所基于的字母,共26个。 英文字母渊源于拉丁字母,拉丁字母渊源于希腊字母,而希腊字母则是由腓尼基字母演变而来的。 大约公元前13世纪,腓尼基人创造了人类历史上第一批字母文字,共22个字母(无元音)。这是腓尼基jvzquC41dkmuq|rcnn4col}0eqs0
6.英文字母大小写英文字母大小写工具是一种能够自动将英文单词或句子转换为大写或小写形式的实用工具。 请输入相关内容 方式 全部转换为大写 全部转换为小写 每个单词首字母大写 单词首字母大写 提交jvzquC41tgsfkwx0eqs0kwigz1gqr8jpia€i
7.Jellyfin/JellyfinGlossary—葡萄牙语(巴西)@Weblate语言 葡萄牙语(巴西) 语言代码 pt_BR 文字方向 从左至右 区分大小写 区分大小写 语言使用者数量 200247320 复数数量 3 复数类型 一个/许多/其他 复数形式 单个 0、1 很多 1000000、2000000 其他 2、3、4、5、6、7、8、9、10、11、… 复数公式 (n == 0 || n == 1) ? 0 : ((n != 0 &&jvzquC41vtgouufvg0pfnu~hkp4ptp4rtqpfe}x1lgrm{onp1irpu|ft{1vuaKW1
8.流畅的Python第二版(GPT重译)(二)(4)超出Unicode 标准中的规范化和大小写折叠之外,有时候进行更深层次的转换是有意义的,比如将'café'改为'cafe'。我们将在下一节看到何时以及如何进行。 极端的“规范化”:去除变音符号 谷歌搜索的秘密酱包含许多技巧,但其中一个显然是忽略变音符号(例如,重音符号、锐音符等),至少在某些情况下是这样。去除变音符号并jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:9:6673
9.codecs当从线路接收主机名时(例如反向名称查找),到 Unicode 的转换不会自动被执行:希望向用户提供此种主机名的应用应当将它们解码为 Unicode。 encodings.idna 模块还实现了 nameprep 过程,该过程会对主机名执行特定的规范化操作,以实现国际域名的大小写不敏感特性与合并相似的字符。 如果有需要可以直接使用 nameprep 函数jvzquC41fqit0y~vjqt/q{l1|j3dp88091rjd{ft{1ipfnhu0jznn
10.MicrosoftSQLServer2005中的国际功能|MicrosoftLearn例如,可对同一列进行大小写转换,并将结果放到两个不同列中。 字符映射表转换支持以下映射操作: 展开表 操作 说明 Byte reversal 反转字节顺序。 Full width 将半角字符映射到全角字符。 Half width 将全角字符映射到半角字符。 Hiragana 将片假名字符映射到平假名字符。 Katakana 将平假名字符映射到片假名字符。 jvzquC41oujo0vnetqyph}3eqo5{j6hp1noctjw{1dh459>84
11.最佳实践:如何选择合适的Analyzer|Cloud|ZillizCloud开发这些过滤器在大多数以空格分隔的语言(英语、法语、德语、西班牙语等)中至关重要,并能显著提升搜索质量: 📘说明 对于东亚语言(中文、日语、韩语等),请重点使用语言特定的过滤器。这些语言的文本处理方式不同,通常不需要或无法从词干提取中获益。 文本规范化过滤器​ jvzquC41fqit0ƒnnnk€/exr0ep5eqlx1ejupun2vjg3skpmv/ctbn‚gt/lpt6~qwt3vun2ecuk
12.JellyfinAndroid/JellyfinAndroid—葡萄牙语(巴西)@Weblate语言葡萄牙语(巴西) 语言代码pt_BR 文字方向从左至右 区分大小写区分大小写 语言使用者数量200247320 复数数量3 复数类型一个/许多/其他 复数形式单个0、1 很多1000000、2000000 其他2、3、4、5、6、7、8、9、10、11、… 复数公式(n == 0 || n == 1) ? 0 : ((n != 0 && n % 1000000 == 0jvzquC41vtgouufvg0pfnu~hkp4ptp4rtqpfe}x1lgrm{onp/ctetxnf1lkmn‚kkp/gof{tkf1vuaKW1
13.文本操作引用将文本的大小写更改为大写、小写、首字母大写或句首字母大写。 输入参数 展开表 参数可选接受默认值说明 Text to convert 是 文本值 要转换的文本 Convert to 不适用 大写、小写、首字母大写、句首字母大写 大写 指定要使用的文本大小写样式 生成的变量 展开表 参数类型​​说明 TextWithNewCase 文本值 新的 jvzquC41nggsp7rketutqoy0eqs0|q2ep1vpynw/cwzpojyg1fktm}tr/hrpy|4cevopp|2tghksgwhg1vkyv
14.西班牙语翻译西班牙语在线翻译英文大小写转换 中文转拼音 英语翻译 日语翻译 韩语翻译 维吾尔语翻译 粤语翻译 藏语翻译 德语翻译 法语翻译 俄语翻译 西班牙语翻译 阿拉伯语翻译 意大利语翻译 马来语翻译 拉丁语翻译 泰语翻译 缅甸语翻译 图片文字识别 图片文字识别 单张快速识别 图片文字识别 jvzquC41crv/z~slkgveh7hqo1lbp‚ngu4iiu
15.创新互联Python教程:codecs—编解码器注册和相关基类这些优化机会对于 CPython 来说仅能通过一组有限的别名(大小写不敏感)来识别:utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (Windows 专属), ascii, us-ascii, utf-16, utf16, utf-32, utf32, 也包括使用下划线替代连字符的的形式。 使用这些编码格式的其他别名可能会导致更慢的执行jvzq<84esy€k|7hp1cxuklqg1fnpfriu0jznn
16.发行说明对于tar.gz 文件中的驱动程序:中文(简体) | 中文(繁体) | 英语(美国) | 法语 | 德语 | 意大利语 | 日语 | 韩语 | 葡萄牙语(巴西) | 俄语 | 西班牙语13.2 中的新功能展开表 功能/ 特点详细信息 JSON 数据类型支持 本机支持 SQL Server 的新 JSON 数据类型,并提供用于插入、选择、存储过程和大容量复jvzquC41vgiipny0okisq|thv0ipo8j/et0nrgtct0cj864586
17.TowardsDataScience博客中文翻译2020(五百二十三)如果你认为GPT-3 让编码员过时了,你可能就不会写代码了 原文:https://towardsdatascience.com/if-you-think-gpt-3-makes-coders-obsolete-you-probably-do-not-write-code-25fbc6461362?source=collection_archive---14--- 意见 反驳数据科学家和开发人员过时 来自PexelsjvzquC41dnuh0lxfp0tfv8|k|cxehxwegn5bt}neng5eg}fknu526;<56496
18.发送消息内容结构服务端API开发文档id_ID(印尼语) vi_VN(越南语) th_TH(泰语) pt_BR(葡萄牙语) es_ES(西班牙语) ko_KR(韩语) de_DE(德语) fr_FR(法语) it_IT(意大利语) ru_RU(俄语) ms_MY(马来语) 注意: 语言类型大小写敏感,传值时请保持与上述枚举值完全一致。 每种语言下(若有)文本则不能为空。 文本长度不能超过 20 个jvzquC41qrko0ojkuj{/ew4fqe{ngwy1ugxwg{2fqey0kv2x31sfu|fig/ipp}jpv/jfulwkrvopp8htgczfasxqp