mysql能用中文吗

嘿,你是问MySQL在中国的情况吗?我帮朋友做这件事的时候也遇到过很多坑,所以想和大家聊聊。

上周,一位客户问我为什么他的数据存储为中文,但当他提出这个问题时,却插入了一堆字符。
当他看到这一幕的时候,身影彻底被毁掉了。

最重要的是制定正确的计划。
启动MySQL程序集后,快速执行“character_set_%%”SHOW VARIABLES SHOW';查看输出。
关键变量是utf8 mb4 ,支持4 字节中文,比老版本的utf8 更宽。
如果你看到character_set_server不是utf8 mb4 ,那么你需要更改配置文件。

就像 my.ini 适用于 Windows,而 my.cnf 适用于 Linux。
找到 [mysqld] 部分并添加字符 set-serv=utf8 mb4 修改后必须关闭MySQL服务,否则就没用了。

然后在创建数据库和表的时候,也要指定描述方式。
像这样: sql 创建数据库 db_name 字符集 utf8 mb4 整理 utf8 mb4 _unicode_ci; 表名( id INT 自动递增主键 名称 VARCHAR(5 0) 字符集 utf8 mb4 NOT NULL ) MACHINE=InnoDB DEFAULT CHARSET=utf8 mb4 ;
这样新创建的数据库表就可以正常存储汉字了。

但我强烈建议您在表和字段名中使用中文名称。
上次我把项目用中文命名,但是在交叉迁移过渡的时候报了各种错误。
使用英文或拼音,兼容性绝对稳定。
如果一定要使用中文,记得到处都用反引号括起来,就像这个命令一样。

如果数据库建好或者表字段描述不正确,可以使用 ALTER TABLE_NAME CONVERT TO SYSTEM SET utf8 mb4 ;但这个操作非常危险,所以最好先回忆一下。

另一个常见问题是错误 1 3 6 6 :所描述的字段不是 UTF-8 这通常是由于表字段的转码模式单独设置与数据库的转码模式冲突,需要统一更改字段的转码模式。

命令行中的汉字比较烦人。
您可以尝试 chcp 6 5 001 命令(Windows 下),或者在 Linux 上使用 LANG=en_US.UTF-8 设置环境变量。
客户端的编码工具必须兼容MySQL。

平心而论,虽然使用了中文表名和字段名,但其实并不推荐使用。
用我们几年前拍下的各种古法典,让我们让中国人的名字哭起来。
戴起来很痛苦。

所以我的建议是:用utf8 mb4 命名字符,但是用英文/拼音。
当你搜索中文时间时,只有SET名称是utf8 mb4 ;该模式为会话模式的音译。

您还有其他问题吗?例如,存储系统中的中文参数,这也很冒犯。

mysql数据库中如何处理多语言字段

嘿,让我告诉你一些关于我在构建系统时如何处理多语言问题的信息。
那是前年的事了。
当我们从事电子商务后端时,客户需要支持十多种语言。
当时就头疼。

一开始我想到的是,在产品表中添加一堆字段,比如title_zh、title_en等等。
事实证明这太复杂了。
后来我和团队讨论,决定采用单独的日程结构。
事实证明,这个方法确实有效。

看,主表包含了核心数据。
For example, the product table has two fields, ID and SKU.创建表产品(id INT PRIMARY KEY, sku VARCHAR(5 0));就是这样。
然后创建一个单独的product_i1 8 n表来存储多种语言的描述、名称等,并使用product_id和lang_code作为共享主键。
创建表product_i1 8 n(product_id INT,lang_code VARCHAR(1 0),名称VARCHAR(2 5 5 ),描述TEXT,主键(product_id,lang_code));这样,如果要添加新的语言,可以直接向product_i1 8 n中插入记录,无需改变表结构,非常方便。

For the character set, we use utf8 mb4 uniformly.这一点非常重要,否则中文、阿拉伯文等特殊字符将无法保存。
排序规则是utf8 mb4 _unicode_ci,这样排序规则和一切都符合国际标准。

创建查询时,使用 LEFT JOIN 连接主表和语言表。
For example, if you want Chinese titles in English by default, just create COALESCE. SELECT p., COALESCE(i1 .name, i2 .name) AS name... This way, if there is no Chinese record, it will automatically use English.这个技巧救了我好几次。
想想看,如果某种语言的数据不完整,你仍然可以保存它。

语言标签,我们使用标准的IETF语言标签,例如zh-CN、en-US。
您还应该有一个支持哪些语言以及默认语言的列表。
输入数据时,必须确保有默认语言的记录。
We also created a trigger that will prevent the user from exiting until the default language is entered.
Compared to adding the language field directly to the main table, there is a h3 difference. Think, if the customer wants to add Vietnam in the future, you have to change the structure of the table, which is very troublesome.分离的表结构更加灵活。

Oh, by the way, there are also suggested extensions.在product_i1 8 n表lang_code上添加索引,CREATE INDEX idx_lang_code ON Product_i1 8 n(lang_code);这个查询速度更快。
Batch input is also very good, it can save a lot of trouble. INSERT INTO...a bunch of data is inserted at once.
总的来说,分离的多语言表结构非常好用,扩展性强,数据完整性稳定。
适合语言较多、需求可能发生变化的情况。
你尝尝,一定很好吃。