我有一个名为username
的列,我希望用户能够以日语,罗马语,阿拉伯语,韩语以及所有可能的字符(包括特殊字符[https://en.wiktionary.org/wiki/Index:All_languages])插入文本, COLLATE
我应该在数据库和表上进行设置吗?
我正在使用utf_general_ci
,我是新手,所以我不知道这是否是满足我需求的最佳COLLATE
。我需要选择正确的COLLATE
以避免sql错误,因为我不会使用preg_replace
或函数来替换特殊字符,因此我只会使用prepared statement
避免SLQ注入并通过数据库。
答案 0 :(得分:2)
utf8mb4_0900_ai_ci
utf8mb4_unicode_520_ci
utf8mb4_unicode_ci
utf8_unicode_ci
数字表示Unicode标准9.0、5.20和(无数字)4.0。
没有排序规则适合同时对所有语言进行排序。西班牙语,德语,土耳其语等具有不兼容的怪癖。上面的归类是可用的“最佳”通用归类。
utf8mb4处理所有尚未由Unicode指定的字符(包括切诺基,克林贡语,楔形文字,拜占庭语等)
如果重点是葡萄牙语:
请参见https://pt.stackoverflow.com/和MySQL collation for Portugese。
研究this for 8.0或this for pre 8.0,以查看哪种utf8 / utf8mb4归类最接近“正确地”分类葡萄牙语。也许utf8mb4_danish_ci
或utf8mb4_de_pb_0900_ai_ci
是最好的。
(否则,请使用上面列出的“选择”。)
答案 1 :(得分:1)
如果使用MySQL 5.5.3或更高版本,我建议使用UTF-8字符编码utf8mb4_unicode_ci
。 AFAIK支持大多数(如果不是全部)语言,并实现Unicode标准进行排序和比较。作为第二选择,请看一下utf8mb4_general_ci
,它可能更快但也不太准确。
有关更多详情,请参见this excellent SO post,或查看official MySQL doc。
在5.5.3以下,utf8_unicode_ci
是您的朋友。