修改数据库的校对规则

说实话,MySQL的字符和排序规则确实有点烦人。
刚拿到老项目的时候,因为数据库的规则有错误,我用插值汉字工作了整整一个星期。

我遇到的两个典型场景是指定字符和为数据库创建排序规则。
当我在做一个电子商务系统时,客户用它来支持繁体中文字符。
当时我直接在CREATE语句中添加了COLLATE='utf8 _unicode_ci',但是忘记找到服务器的默认设置了。
还好我及时发现并改了恢复默认值。
还有一次,Buddy利用latina1 _swedish_ci团队在windows环境下创建了一个shell库。
在Linux生产环境中运行时,出现插入中文字符的情况。
这个读数太高了。

可以通过三种方式修改审批规则。
我会向你解释它们; 1 .创建测试DATABASE时指定CREATE DEFAULT COLLATERAL utf8 _general_ci。
这是最准确的,但前提是你要清楚每个预测试规则的差异。
我有一个客户争论了很久是选择utf8 _bin还是utf8 _general_ci,最后发现业务场景根本不需要二进制比较那么严格。
2 、使用最常用的ALTER语句。
我手里有一份运维脚本。
每当团队中有人提交代码时,都会立即执行 ALTER DATABASE mydb DEFAULT COLLATE utf8 _unicode_ci 以避免错误。
但需要注意的是,ALTER 在大型库中工作需要很长时间。
记住早上第一件事就是在测试环境中工作。
3 .my.cnf配置,我在这方面遇到了坑。
鉴于上述错误,它非常具有代表性。
当时我在配置文件中写了赋值=utf8 _general_ci,但是mysqld直接爆炸了。
后来发现应该是写为collat​​ion-serv=utf8 _general_ci。
我在修道院的讨论中看到了这一点;这是在服务器重新启动后完成的。
树上整行都写满了红色警告,让我很震惊。

最大的事情是MySQL对于测试规则相当随意。
我尝试用现有的数据utf8 mb4 _09 00_ai_ci修改库,发现遗留字符串突然失败了一些匹配语句。
当时数据迁移花了两天时间,整个SQL执行计划都要重新审核。
因此,我们团队现在决定,在更改测试规则后,将建立一个临时数据库进行第一次测试,数据量应超过1 00万条。

归根结底,字符规则和排序规则就像数据库的“方言”。
只有选择正确的信息才能正常共享。
不过,MySQL 官方文档中有一个文件列出了所有的排序规则(区分大小写、不区分重音、koi8 -r 等)。
我建议你保留一个例子,以便在出现疑问时避免自己受到伤害。

mysql 为什么存不了汉字

哎呀,这真让我烦恼。
有一年,我帮家乡的一家餐馆建网站,在数据库里找不到餐馆的名字“福禄寿宴”。
我检查了一下,发现这是问题所在。

看吧,默认的MySQL字符集是latin1 那怎么能存储汉字呢?不可能的。
当时我使用的是utf8 mb4 ,它只支持多字节汉字。

操作起来并不难。
建数据库时指定:
sql 创建数据库 mydiner 字符集 utf8 mb4 排序规则 utf8 mb4 _unicode_ci;
建表也指定:
sql 创建表烹饪( ID 整数, 名称 VARCHAR(2 5 5 ) 字符集 utf8 mb4 COLLATE utf8 mb4 _unicode_ci );
有时我忘记更改它。
例如,如果您从别人的旧系统中获取它,请在您的建表语句中添加以下内容:
sql ALTER TABLE Cooking 修改名称 VARCHAR(2 5 5 ) 字符集 utf8 mb4 COLLATE utf8 mb4 _unicode_ci;
还必须维护客户端连接。
当我创建PHP时,我在连接之前添加了以下语句:
php $conn = new mysqli("localhost", "user", "pass", "mydiner"); $conn->query("设置名称 utf8 mb4 ");
最重要的是前端数据传输。
我记得有一个前端愚蠢地发送了gbk编码,但是mysql收到了乱码。
这需要在前端正确完成,否则后端将接收数据并将其转换为 utf8 mb4 然后再保存。
当时我使用的是php的mb_convert_encoding。

这是一个小细节,但不要忘记添加mb4 (utf8 mb4 )。
这允许您保存包含“福🐲夜”等表达方式的汉字。
上次给同学做的,我只是改成了UTF8 ,但是他的“富强”表情没有保存。
自从我意识到我没有 mb4 以来已经有一段时间了。

也就是说,所有的链接在字符集上都必须是平滑的。
数据库、表、客户端连接和应用程序都需要调整。
如果你一步一步地修复它,通常会解决。
如果不起作用,请检查您的服务器配置或在日志中查找故障。
我还帮忙完成了餐厅的收尾工作,老板很高兴我们能够保存Fukuroju no Banquet(笑)。

MySQL中数据库的默认字符集和校对规则有哪些?

ASCII:用于映射U+0000-U+007 F范围内的英文字母、数字等简单字节字符,不足以表示非ASCII字符。

UNICODE:涵盖 ASCII 和 U+0000-U+1 0FFFF 之间的其他字符。
ASCII 是 UNICODE 的子集,可以无损转换。

MySQL字符集:
Latin1 (cp1 2 5 2 /ISO-8 8 5 9 -1 ):单字节;兼容ASCII,节省字符空间。

GB1 8 03 0:中国官方标准,兼容GBK和GB2 3 1 2 ,使用1 -4 字节。
1 -4 字节; Windows系统默认;存储汉字的空间很小。
以及快速排序和检索。

UTF8 :Unicode编码实现; 1 -4 字节代表符号; 1 个字节用于字母数字字符;汉字3 个字节; 4 个字节用于 emoji 表情; MySQL 默认为 UTF8 MB4
MySQL默认使用UTF8 MB4 ,最多支持4 字节字符。