目 录CONTENT

文章目录

解决方案 | MySQL 相关

Wissy
2024-09-27 / 0 评论 / 1 点赞 / 48 阅读 / 0 字

一、字符集(Character Sets)

  • 字符集(Character Sets):定义了字符以及字符的编码。

  • 字符序(Collations):定义了字符的比较规则,又名排序规则。

  • Unicode(The Unicode Standard):其官方机构Unicode联盟所用的中文名称为统一码,又译作万国码。这里只是一个标准。其实现有

    • UTF-8​:1~4个字节(bytes)表示一个符号(character)。-- 使用最广
    • UTF-16​:每个字符用两个字节或四个字节表示。
    • UTF-32​:每个字符用四个字节表示。

MySQL 提供服务器(Server)、数据库(Database)、表(Table)、列(Column)等级别修改不同的数据集,默认使用上一级别定义的数据集。

1.1 查看支持的数据集

SHOW CHARACTER SET; 
-- 或者
SELECT * FROM information_schema.HARACTER_SETS; 

MySQL在Version 4.1开始支持utf8​,目前比较有歧义的是utf8​、utf8mb3​和utf8mb4

默认 MySQL 的 utf8​ 字符集为utf8mb3​(隐式命名在未来可能会变更为uft8mb4​),与其他语言对应的 utf8 其实是 utf8mb4

1.2 创建时定义为utf8mb4

CREATE TABLE xxx(
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) CHARACTER SET utf8mb4,
  description TEXT CHARACTER SET utf8mb4,
  gmt_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

1.3 修改已有库/表/列为utf8mb4

修改库(特别注意:生产环境谨慎操作,修改字符集会导致锁表!!!

ALTER DATABASE xxxx CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

生成修改表 SQL 语句

SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'xxx' 
AND TABLE_TYPE = 'BASE TABLE';

生成修改列 SQL 语句

SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' MODIFY ', COLUMN_NAME, ' ', COLUMN_TYPE, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'xxx' 
AND COLLATION_NAME LIKE 'utf8%';

二、参考文档

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区