PHP + MySQL +西班牙语

时间:2016-08-29 09:26:10

标签: php mysql laravel encoding collation

我的系统处理西班牙语数据。我正在使用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;

有几个问题:

  1. 我将数据从文件加载到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 '='

  2. 如果使用utf8_encode是要走的路,我是否需要utf8_encode甚至名称我想搜索?即选择...其中name = utf8_encoded(名称)?

  3. 是否有任何缺陷或更好的方法来处理上述问题?我第一次做西班牙语(带重音的人物)。

1 个答案:

答案 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。)