我的系统处理西班牙语数据。我正在使用laravel + mysql。我的数据库排序规则是latin1 - 默认排序规则,我的表格结构如下所示:
CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) CHARACTER SET latin1 NOT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=298 DEFAULT CHARSET=utf8mb4;
有几个问题:
我将数据从文件加载到db。这是一个好习惯吗?
插入db之前的utf8_encode($ name)?我目前正在这样做,
否则一些比较抛出错误:SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_unicode_ci,COERCIBLE) for operation '='
如果使用utf8_encode是要走的路,我是否需要utf8_encode甚至名称我想搜索?即选择...其中name = utf8_encoded(名称)?
是否有任何缺陷或更好的方法来处理上述问题?我第一次做西班牙语(带重音的人物)。
答案 0 :(得分:0)
您的product.name
列的字符集为latin1
。你知道的。它还具有排序latin1_swedish_ci
。这是默认值。 MySQL的原始开发人员是瑞典语。因为您使用的是西班牙语,所以您可能希望使用latin1_spanish_ci
进行整理;它会在Ñ
之后对N
进行排序。其他拉丁语排序将它们组合在一起。
因为您的product.name
列存储在latin1中,所以错误,而不是好,想法之前在文本上使用utf8_encode()
将它存储到该列。
您最好的行动方案,特别是如果您的应用是新的,是为所有列utf8mb4
制作字符集。这意味着更改name
列的已定义字符集。然后,您可以在存储之前将文本字符串转换为unicode。
您也可以明智地对每个表utf8mb4_spanish_ci
进行默认排序规则。归类将被绑定到varchar()
列的索引中。 (如果您使用的是传统西班牙语,ch
是一个独特的字母,请使用utf8mb4_spanish2_ci
。)