PHP + MySQL + 西班牙语
Posted
技术标签:
【中文标题】PHP + MySQL + 西班牙语【英文标题】:PHP + MySQL + Spanish 【发布时间】:2017-01-05 06:40:12 【问题描述】:我的系统处理西班牙数据。我正在使用 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;
有几个问题:
我将数据从文件加载到数据库。这是一个好习惯
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 甚至我想搜索的名称?即选择...其中名称= utf8_encoded(name)?
是否有任何缺陷或更好的方法来处理上述问题?因为我第一次做西班牙语(带重音的字符)。
【问题讨论】:
我的印象是 MySQL 中的VARCHAR
s 默认为 UTF8,因此您在使用它们时不必使用 utf8_encode
。
@MartinParkin 更新了我在没有 utf8 编码的情况下插入数据时遇到的错误。然后使用 = 过滤器进行选择。
【参考方案1】:
您的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
。)
【讨论】:
以上是关于PHP + MySQL + 西班牙语的主要内容,如果未能解决你的问题,请参考以下文章