天道酬勤,学无止境

MySQL不区分大小写但区分口音的UTF8唯一键(MySQL Case Insensitive but Accent Sensitive UTF8 Unique Key)

问题

我知道科幻小说中有很多类似的问题,但我认为我的观点与众不同,足以提出一个新的问题。 我有一个表,其中有一个单列为utf8和utf8_unicode_ci。 它在此列上还有一个唯一键,以及另一个标记语言代码的列。 列中的数据使用许多不同的脚本(拉丁字母,带有不同的口音,中文和俄语等)。

问题是我有时会想输入两个词,它们的含义不同,只是变音符的意思不同(即西班牙语ano vsaño)。 由于utf8_unicode_ci不区分大小写和重音,因此它认为它们是相同的,只允许我输入一个。 糟透了。 理想情况下,我只是将整个列切换为不区分大小写但区分重音的某种排序规则,但这似乎不存在。 许多不同的东西都使用此列,因此我不希望将该列的默认排序规则更改为utf8_bin,以免混淆大小写。

因此,所有这些都说明了,我需要一种解决方案,该解决方案不会影响击中此列的许多现有查询中的默认区分大小写,但允许我添加仅带有变音符号的单词。 有想法吗? 如果需要的话,我只会将唯一键约束切换到utf8_bin,但我不想这样做,因为我从不希望表中的两件事仅因大小写而不同。

回答1

我唯一能想到的(没有找到适合您需要的排序规则)是在应用程序层(MySQL外部)进行一些更改,以照顾到差异化。

例如,由于您不关心大小写,因此可以以编程方式执行一些操作来降低数据库中所有行的大小写。 然后将排序规则更改为utf8_bin。

然后,您可以在应用程序中将所有内容转换为小写,然后再进入数据库(我猜这不会影响变音符号)。 这样,如果人们尝试输入多个案例,您仍然会出错,您只需要更改几行代码即可对进入表中的内容进行预处理,而不会遇到变音符号的问题。

回答2

您不必在这里重新发明the胎(重新设计车轮)。

MySQL中有两种西班牙语排序规则:

utf8_spanish_ci(现代西班牙语)和utf8_spanish2_ci(传统西班牙语)

他们非常了解该语言,知道应该将N和n整理在一起,但是Ñ和ñ是N和O之间的不同字母。在西班牙语中,Ñ实际上是不同的字母,而不是重音。

将您的列排序规则设置为utf8_spanish_ci,所有设置都将按照您想要的方式工作。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • MySQL如何在UTF-8中“不区分大小写”和“不区分重音”的工作方式(How to MySQL work “case insensitive” and “accent insensitive” in UTF-8)
    问题 我在“ utf8-UTF-8 Unicode”中有一个模式作为字符集,并有一个排序规则“ utf8_spanish_ci”。 所有内部表都是具有相同字符集和排序规则的InnoDB。 问题来了: 用类似的查询 SELECT * FROM people p WHERE p.NAME LIKE '%jose%'; 我得到83个结果行。 我应该有84个结果,因为我知道。 更改位置: WHERE p.NAME LIKE '%JOSE%'; 我得到完全相同的83行。 使用JoSe,Jose,JOSe等组合时,将报告所有相同的83行。 当游戏中出现口音时,问题就来了。 如果这样做: WHERE p.NAME LIKE '%josé%'; 我没有结果。 0行。 但是,如果我这样做: WHERE p.NAME LIKE '%JOSÉ%'; 我只得到一行结果,所以只有1行。 这是唯一强调“ jose”并大写的行。 我尝试过使用josÉ或JoSÉ或我所做的任何组合,只要带重音的字母保持为大写或不大写,因为它实际上存储在数据库中,并且仍然返回唯一的行。 如果我突然用JOSE中的大写字母将“É”更改为“é”,它将不返回任何行。 因此得出结论: 如果游戏中没有拉丁字符,则不区分大小写。 如果出现拉丁字符,则区分大小写。 口音敏感,就像我搜索JOSE或jose一样,我只得到83行,而不是我需要的84行。
  • MySQL变音符号不敏感搜索(西班牙口音)(MySQL diacritic insensitive search (spanish accents))
    问题 我有一个MySQL数据库,其单词包含西班牙语(áéíóú)的重音。 我想知道是否可以进行变音符号不敏感搜索。 例如,如果我搜索“ lapiz”(不带重音),我想从数据库中获取包含“lápiz”一词的结果。 我当前执行查询的方式如下: $result = mysql_query("SELECT * FROM $lookuptable WHERE disabled = '0' AND name LIKE '%$q%' OR productCode LIKE '%$q%' LIMIT $sugglimit"); 这是一家在线商店,所以我不知道人们会搜索什么……“ lapiz”只是一个例子。 替代文字http://www.freeimagehosting.net/uploads/0e7c2ae7d5.png 谢谢! 回答1 字符集和排序规则,不是我的最爱,但它们确实起作用: mysql> SET NAMES latin1; mysql> SELECT 'lápiz' LIKE 'lapiz'; +-----------------------+ | 'lápiz' LIKE 'lapiz' | +-----------------------+ | 0 | +-----------------------+ 1 row in set (0.01 sec) mysql> SET
  • 如何进行不区分大小写的字符串比较?(How do I do a case-insensitive string comparison?)
    问题 如何在Python中进行不区分大小写的字符串比较? 我想以一种非常简单且Pythonic的方式封装对常规字符串与存储库字符串的比较。 我还希望能够使用常规python字符串在由字符串散列的字典中查找值。 回答1 假设ASCII字符串: string1 = 'Hello' string2 = 'hello' if string1.lower() == string2.lower(): print("The strings are the same (case insensitive)") else: print("The strings are NOT the same (case insensitive)") 回答2 以不区分大小写的方式比较字符串似乎很简单,但事实并非如此。 我将使用Python 3,因为Python 2在这里尚未开发。 首先要注意的是,使用Unicode进行大小写转换并非易事。 有些文本具有text.lower() != text.upper().lower() ,例如"ß" : "ß".lower() #>>> 'ß' "ß".upper().lower() #>>> 'ss' 但是,假设您想"Buße"比较"BUSSE"和"Buße" 。 哎呀,您可能还想将"BUSSE"和"BUẞE"相等-这是较新的资本形式。 推荐的方法是使用casefold:
  • 如何在MySql中进行口音敏感搜索(How to conduct an Accent Sensitive search in MySql)
    问题 我有一个带有utf8常规ci排序规则的MySQL表。 在表中,我可以看到两个条目: 世纪阿巴德 我正在使用如下查询: SELECT * FROM `words` WHERE `word` = 'abád' 查询结果给出两个词: 世纪阿巴德 有没有办法表明我只希望MySQL找到带重音的单词? 我希望查询仅返回 阿巴德 我也尝试过以下查询: SELECT * FROM `words` WHERE BINARY `word` = 'abád' 它没有给我任何结果。 感谢您的帮助。 回答1 如果您在该字段上的搜索始终对重音敏感,则将该字段的排序规则声明为utf8_bin(它将对utf8编码的字节进行相等性比较),或使用特定于语言的排序规则来区分重音和un -重音字符。 col_name varchar(10) collate utf8_bin 如果搜索通常对重音不敏感,但您想对此搜索例外,请尝试; WHERE col_name = 'abád' collate utf8_bin 回答2 在我的版本(MySql 5.0)中,没有任何utf8字符集归类用于不区分大小写,区分重音的搜索。 utf8唯一的重音敏感整理是utf8_bin。 但是,它也是区分大小写的。 我的解决方法是使用类似以下的方法: SELECT * FROM `words` WHERE LOWER(column) =
  • UTF-8:一般? 斌吗 Unicode?(UTF-8: General? Bin? Unicode?)
    问题 我试图弄清楚我应该对各种类型的数据使用哪种排序规则。 我要存储的内容的100%是用户提交的。 我的理解是,我应该使用UTF-8 General CI(不区分大小写),而不是UTF-8 Binary。 但是,我找不到UTF-8通用CI和UTF-8 Unicode CI之间的明显区别。 我应该将用户提交的内容存储在UTF-8 General或UTF-8 Unicode CI列中吗? UTF-8 Binary适用于什么类型的数据? 回答1 通常, utf8_general_ci比utf8_unicode_ci快,但正确性较差。 区别在于: 对于任何Unicode字符集,使用_general_ci归类执行的操作都比使用_unicode_ci归类进行的操作要快。 例如,utf8_general_ci归类的比较比utf8_unicode_ci的比较更快,但正确性稍差。 原因是utf8_unicode_ci支持诸如扩展之类的映射。 也就是说,当一个字符与其他字符的组合比较相等时。 例如,在德语和其他一些语言中,“ß”等于“ ss”。 utf8_unicode_ci还支持收缩和可忽略字符。 utf8_general_ci是旧版归类,不支持扩展,收缩或可忽略的字符。 它只能在字符之间进行一对一比较。 引用自:http://dev.mysql.com/doc/refman/5.0/en
  • MySQL中大小写问题
    MySQL中大小写问题 1.MySQL大小写敏感规则MySQL中,一个库会对应一个文件夹,库里的表会则以文件的方式存放在文件夹内,所以,操作系统对大小写的敏感性决定了数据库和表的大小写敏感(MySQL有一个只读的系统变量lower_case_file_system,其值反映的正是当前文件系统是否区分大小写)因此:在Windows下Mysql的数据库和表名是大小写不敏感的,而在大多数类型的Unix系统中是大小写敏感的。 以下是MySQL详细的大小写区分规则:在Linux下: 1、数据库名与表名是严格区分大小写的; 2、表的别名是严格区分大小写的; 3、列名与列的别名在所有的情况下均是忽略大小写的; 4、变量名也是严格区分大小写的; 在Windows下: 全部不区分大小写 补充:1.MySQL中有一个系统变量:lower_case_table_names,专门用来配置是否区分据库名与表名的大小写。 如果你的系统是Windows,而你又希望mysql能够区分大小写,那么你可以在my.ini文件中,在[mysqld]一节的最后,加入如下部分:[plain] view plain copy #If set to 0, table names are stored as specified and comparisons are case sensitive. #If set to 1
  • 如何使用LIKE通配符在列中搜索(不区分大小写)?(How can I search (case-insensitive) in a column using LIKE wildcard?)
    问题 我环顾四周,却找不到我想要的东西,所以去了。 SELECT * FROM trees WHERE trees.`title` LIKE '%elm%' 这很好用,但是如果树被命名为Elm或ELM等则不行。 如何使此通配符搜索的SQL大小写不敏感? 我正在使用MySQL 5和Apache。 回答1 SELECT * FROM trees WHERE trees.`title` COLLATE UTF8_GENERAL_CI LIKE '%elm%' 实际上,如果将COLLATE UTF8_GENERAL_CI添加到列的定义中,则可以忽略所有这些技巧:它将自动运行。 ALTER TABLE trees MODIFY COLUMN title VARCHAR(…) CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI. 这还将重建该列上的所有索引,以便可以将其用于查询而无需以“%”开头 回答2 我总是用lower解决这个问题: SELECT * FROM trees WHERE LOWER( trees.title ) LIKE '%elm%' 回答3 区分大小写在列/表/数据库排序规则设置中定义。 您可以通过以下方式在特定归类下进行查询: SELECT * FROM trees WHERE trees.`title` LIKE '%elm%'
  • 如何为MySQL和Postgres编写不区分大小写的查询?(How do you write a case insensitive query for both MySQL and Postgres?)
    问题 我正在本地运行一个MySQL数据库以进行开发,但是正在部署到使用Postgres的Heroku。 Heroku处理几乎所有内容,但是不区分大小写的Like语句变得区分大小写。 我可以使用iLike语句,但是我的本地MySQL数据库无法处理该语句。 编写与MySQL和Postgres兼容的不区分大小写的查询的最佳方法是什么? 还是我需要根据与我的应用程序交谈的数据库编写单独的Like和iLike语句? 回答1 select * from foo where upper(bar) = upper(?); 如果在调用方中将参数设置为大写,则可以避免第二个函数调用。 回答2 这个故事的寓意是:不要使用不同的软件堆栈进行开发和生产。 绝不。 您将最终遇到无法在开发人员中重现的错误; 您的测试将一文不值。 只是不要这样做。 不可能使用其他数据库引擎-在更多情况下,它的行为将不只是LIKE(此外,您是否检查了数据库使用的排序规则?在每种情况下它们是否相同?如果不是,则可以忘记在varchar列上使用相同的ORDER BY) 回答3 使用Arel: Author.where(Author.arel_table[:name].matches("%foo%")) matches将对Postgres使用ILIKE运算符,对其他所有ILIKE使用LIKE 。 回答4 在postgres中
  • 如何在Linux服务器中将MySQL表名更改为不区分大小写?(How to change MySQL table names in Linux server to be case insensitive?)
    问题 我正在使用以前托管在Apple服务器上的旧网站。 当它迁移到新的Linux服务器时,它停止工作。 我很确定这是因为php脚本中使用的所有MySQL查询对于表名都有不同的大小写组合(我不知道为什么原始开发人员在创建表名或php脚本时没有遵循任何约定),这并不重要,因为在默认情况下,Mac和Windows MySQL服务器默认都不区分大小写。 但是,Linux不是。 有没有办法在MySQL上更改Linux默认值,使其不区分大小写,并且可以像Mac或Windows一样工作? 我一直在寻找,但没有找到任何不涉及更改脚本或表名或两者的答案。 该网站必须使用某些CMS生成,因此有数十个页面,并且在每个表和数百个表中包含具有多个查询的文件。 我开始尝试以我能想到的最聪明的方式来实施这种解决方案,但是如果我触摸表名,那么其他当前正在工作的页面将停止工作(我试图避免进一步破坏该站点)。 我读取的Linux服务器中Webmin的Webmin的MySQL Server控制台中有一个系统变量(lower_case_table_names),可以将其从0更改为1以解决此问题,但是Webmin不允许我更改它,因为它是“只读“ 多变的。 您可能认为这是一个容易解决的问题,但到目前为止,我已经失去了希望。 我希望有人能得到我目前可能无法回答的答案。 回答1 MySQL的区分大小写默认情况下由文件系统处理
  • 更改MYSQL数据库不区分大小写表名
    今天郁闷死了,在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢?  后来请教了一个老师才搞定,原来是LINUX下的MYSQL默认是要区分表名大小写的,哎,弄了那么旧,害死我了。  让MYSQL不区分表名大小写的方法其实很简单:  1.用ROOT登录,修改/etc/my.cnf  2.在[mysqld]下加入一行:lower_case_table_names=1  3.重新启动数据库即可。1、Linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写;2、用root帐号登录后,在/etc/my.cnf中的[mysqld]后添加添加lower_case_table_names=1,重启MYSQL服务,这时已设置成功:不区分表名的大小写;lower_case_table_names参数详解:lower_case_table_names=0其中0:区分大小写,1:不区分大小写MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:1、数据库名与表名是严格区分大小写的;2、表的别名是严格区分大小写的;3、列名与列的别名在所有的情况下均是忽略大小写的;4、变量名也是严格区分大小写的;MySQL在Windows下都不区分大小写。mysql默认是对字母的大小写不区分的mysql> create
  • Django查询不区分大小写的列表匹配(Django query case-insensitive list match)
    问题 我有一个要区分大小写的名称列表,有没有一种方法,而无需使用如下所示的循环? a = ['name1', 'name2', 'name3'] result = any([Name.objects.filter(name__iexact=name) for name in a]) 回答1 Unfortunatley,没有__iin字段查找。 但是有一个iregex可能有用,像这样: result = Name.objects.filter(name__iregex=r'(name1|name2|name3)') 甚至: a = ['name1', 'name2', 'name3'] result = Name.objects.filter(name__iregex=r'(' + '|'.join(a) + ')') 请注意,如果a可以包含正则表达式中特殊的字符,则需要正确地对它们进行转义。 新闻:在Django 1.7+中,可以创建自己的查找,因此您可以在正确初始化之后实际使用filter(name__iin=['name1', 'name2', 'name3']) 。 有关详细信息,请参见文档参考。 回答2 在Postgresql中,您可以尝试按以下说明创建不区分大小写的索引: https://stackoverflow.com/a/4124225/110274 然后运行查询:
  • MySQL数据库操作规范
    MySQL数据库操作规范 文档说明:该文档旨在对MySQL数据库的使用做一个统一的约定和规范;以便使大家更明确、更有效的用好数据库,最终使数据库发挥更好的作用,从而提升产品的质量。 一、基础规范 1.1、【强制】使用InnoDB存储引擎。解读:InnoDB存储引擎是MySQL默认存储引擎,支持事务和行级锁,并发性能更好,CPU及内存缓存页优化使得资源利用率更高,并且MyISAM在8.0中考虑移除了。 1.2、【强制】使用统一的字符集(utf8或utf8mb4),如果有存储emoji表情之类的,则需要使用utf8mb4,否则使用utf8即可。解读:无需转码,无乱码风险;utf8mb4向下兼容utf8但存储使用的空间会比utf8略大。 1.3、【强制】表、字段必须加入中文注释,注释要言简意赅。解读:便于识别表和字段的用途,有利于维护;反例:t_company_organization_scope_employee 可以采用缩写改成t_com_org_scope_emp 1.4、【强制】禁止使用存储过程、视图、触发器、Event。解读:高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。数据库擅长存储与索引,CPU计算还是上移到业务层
  • Mysql怎样运行的学习笔记之01字符集与比较规则
    01字符集与比较规则 1、编码 在计算机底层,比如'liu'在计算机并不是文字的形式,而是一串二进制数字,例如: 'a' -> 00000001 (⼗六进制:0x01) 'b' -> 00000010 (⼗六进制:0x02) 'A' -> 00000011 (⼗六进制:0x03) 'B' -> 00000100 (⼗六进制:0x04) 人类---计算机之间的交互(互相不认识) 从我们可以看到的文字到 0、1 的映射称为编码,反过来从 0、1 到文字叫解码。这个就是编码的含义。 2、字符 字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。 3、字符集 字符的集合,叫做字符集。ASCII、UTF-8、UTF-16、UTF-32就是字符集。 (1)ASCII 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用 8 个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是 255(二进制11111111=十进制 255),0 - 255 被用来表示大小写英文字母、数字和一些符号,这个编码表被称为 ASCII 编码,比如大写字母 A 的编码是 65,小写字母 z 的编码是 122。 (2)GB2312 收录了汉字以及拉丁字⺟、希腊字⺟、⽇⽂平假名及⽚假名字⺟、俄语⻄⾥尔字⺟
  • Rails模型中不区分大小写的搜索(Case-insensitive search in Rails model)
    问题 我的产品型号包含一些物品 Product.first => #<Product id: 10, name: "Blue jeans" > 我现在要从另一个数据集中导入一些产品参数,但是名称的拼写不一致。 例如,在另一个数据集中,“ Blue jeans可以拼写为“ Blue Jeans 。 我想要Product.find_or_create_by_name("Blue Jeans") ,但这将创建一个新产品,几乎与第一个相同。 如果我想查找和比较小写的名字,该怎么办? 性能问题在这里并不是真正重要的:只有100-200种产品,我想将其作为导入数据的迁移来运行。 有任何想法吗? 回答1 您可能需要在这里更加详细 name = "Blue Jeans" model = Product.where('lower(name) = ?', name.downcase).first model ||= Product.create(:name => name) 回答2 这是Rails中的完整设置,仅供我参考。 如果它也对您有帮助,我感到很高兴。 查询: Product.where("lower(name) = ?", name.downcase).first 验证者: validates :name, presence: true, uniqueness: {case_sensitive
  • MySQL:SELECT语句区分大小写吗?(MySQL: is a SELECT statement case sensitive?)
    问题 谁能告诉我默认情况下MySQL SELECT查询是区分大小写还是不区分大小写? 如果没有,我将必须发送什么查询,以便可以执行以下操作: SELECT * FROM `table` WHERE `Value` = "iaresavage" 实际上, Value的真正Value是IAreSavage 。 回答1 它们不区分大小写,除非您进行二进制比较。 回答2 您可以将值和传递的参数小写: SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("IAreSavage") 另一种(更好的)方法是按照文档中所述使用COLLATE运算符 回答3 使用二进制 这是一个简单的选择 SELECT * FROM myTable WHERE 'something' = 'Something' = 1 这是带有二进制的选择 SELECT * FROM myTable WHERE BINARY 'something' = 'Something' 或者 SELECT * FROM myTable WHERE 'something' = BINARY 'Something' = 0 回答4 比较不区分大小写当列使用的对照,其与端部_ci (例如默认latin1_general_ci核对),并且它们是大小写敏感的,当列使用的对照,其与端部_cs或_bin
  • 搭配MySQL与MySQL搭配使用的最佳排序规则是什么? [关闭](What is the best collation to use for MySQL with PHP? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 改善这个问题 我想知道对于一般网站,MySQL是否有“最佳”整理方式,您不确定100%确定要输入什么? 我知道所有编码都应该相同,例如MySQL,Apache,HTML和PHP中的任何内容。 过去,我已将PHP设置为在“ UTF-8”中输出,但是在MySQL中此匹配哪种排序规则? 我以为它是UTF-8之一,但是我之前曾使用过utf8_unicode_ci , utf8_general_ci和utf8_bin 。 回答1 主要区别是排序准确性(在比较语言中的字符时)和性能。 唯一的特殊之处是utf8_bin,它用于比较二进制格式的字符。 utf8_general_ci比utf8_unicode_ci快一些,但准确性较低(用于排序)。 特定语言utf8编码(例如utf8_swedish_ci )包含其他语言规则,这些规则使它们最准确地分类为这些语言。 大部分时间我都使用utf8_unicode_ci (我宁愿使用精度而不是小幅度的性能改进),除非我有充分的理由偏爱特定的语言。 您可以在MySQL手册(http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
  • MySQL基础(二)
    文章目录 SQL指令常见指令字符集校对集 Web乱码问题数据类型(字段类型)整数型小数型日期时间型字符串类型 列属性空属性列描述默认值主键唯一键 索引关系一对一一对多多对多 数据库设计基本过程教务管理数据库范式(Normal Format)逆规范化 小结 SQL指令 本篇总结MySQL关系模型,先从较为简单和常用的指令开始 常见指令 SQL 对大小写不敏感:SELECT与 select是相同的 多条语句时,每条 SQL 语句的末端使用分号; 命令行中每句结尾必须使用;, 使用--或#表示单行注释 使用下面的数据学习基本MySQL指令: +----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.cm/ | 1 | USA | | 2 | 淘宝 | https://www.taobao.com/ | 13 | CN | | 3 | 菜鸟教程 | http://www.runoob.com/ | 4689 | CN | | 4 | 微博
  • 最强MySQL笔记(超详细版)(一)
    第一章 数据库概述 1.1 数据库概述 DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。 DB:数据库(Database) SQL:结构化查询语言,(Structure Query Language),专门用来操作/访问数据库的通用语言。 如果把数据库比作盘子,那数据就是盘子里的菜,SQL则是你的筷子。 数据库类型:数据库经过几十年的发展,出现了多种类型。目前最常见的数据库模型主要是:关系型数据库和(noSQL)非关系型数据库。 MySQL:其中的一款关系型数据库管理系统 关系型数据库模型是将复杂的数据结构用较为简单的二元关系(二维表)来表示,如图所示。在该类型数据库中,对数据的操作基本上都建立在一个或多个表格上,我们可以采用结构化查询语言(SQL)对数据库进行操作。关系型数据库是目前主流的数据库技术,其中具有代表性的数据库管理系统有:Oracle、DB2、SQL Server、MySQL等。 非关系型数据库: 随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS( 社交网络服务 )类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展
  • 带有LIKE的Oracle中的重音和不区分大小写的排序规则(Accent and case insensitive collation in Oracle with LIKE)
    问题 我发现此答案很有用:在Oracle中,口音和不区分大小写的COLLATE等效,但是我的问题是关于使用版本9 Oracle db进行LIKE搜索。 我已经尝试过这样的查询: SELECT column_name FROM table_name WHERE NLSSORT(column_name, 'NLS_SORT = Latin_AI') LIKE NLSSORT('%somethingInDB%', 'NLS_SORT = Latin_AI') 但不会返回任何结果。 我创建了一个小的Java文件进行测试: import org.apache.commons.dbcp.BasicDataSource; import java.sql.Connection; import java.sql.SQLException; import java.sql.PreparedStatement; import java.sql.ResultSet; public class DbCollationTest { public static void main(String[] args) throws SQLException { BasicDataSource dataSource = new BasicDataSource(); dataSource
  • MySQL:无法建立表格(错误编号:150)(MySQL: Can't create table (errno: 150))
    问题 我正在尝试导入.sql文件及其在创建表时失败。 这是失败的查询: CREATE TABLE `data` ( `id` int(10) unsigned NOT NULL, `name` varchar(100) NOT NULL, `value` varchar(15) NOT NULL, UNIQUE KEY `id` (`id`,`name`), CONSTRAINT `data_ibfk_1` FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 我从同一数据库中导出.sql,删除了所有表,现在我试图导入它,为什么会失败? MySQL:无法建立表格'./dbname/data.frm'(错误号:150) 回答1 从MySQL-外键约束文档: 如果重新创建已删除的表,则该表必须具有符合引用该表的外键约束的定义。 如前所述,它必须具有正确的列名和类型,并且必须在引用的键上具有索引。 如果不满足这些条件,MySQL将返回错误1005,并在错误消息中引用错误150,这意味着未正确形成外键约束。 同样,如果由于错误150而导致ALTER TABLE失败