天道酬勤,学无止境

Making unique key case insensitive

This is my schema for mysql table, im using mysql 5

--
-- Table structure for table `DATA_USER_ROLE`
--

DROP TABLE IF EXISTS `DATA_USER_ROLE`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `DATA_USER_ROLE` (
  `ID` int(11) NOT NULL,
  `NAME` varchar(128) NOT NULL,
  `VAL_ID` int(11) NOT NULL,
  `CREATION_TIME` datetime NOT NULL,
  `ROLE_TYPE` int(11) NOT NULL,
  `STORAGE_TYPE` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `BV_AC_ROLE_KEY_IDX` (`NAME`,`VAL_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Needed UNIQUE KEY case in sensitive,

It should allow to enter the value like('a',0) & ('A', 0)

tried changing collation to latin_1 and latin_generic_ci

评论

The simpliest is to add BINARY on the DDL statement,

`NAME` varchar(128) BINARY NOT NULL
  • SQLFiddle Demo

If you need case sensitive:

ALTER TABLE `DATA_USER_ROLE` CHANGE `NAME` `NAME` VARCHAR( 128 )
CHARACTER SET latin1 COLLATE latin1_bin NULL DEFAULT NULL 

If you need case insensitive:

ALTER TABLE `DATA_USER_ROLE` CHANGE `NAME` `NAME` VARCHAR( 128 )
CHARACTER SET latin1 COLLATE latin1_general_ci NULL DEFAULT NULL 

You can do it in such a way..

create table testTable (col_name varchar(100) character set utf8 
collate utf8_bin not null ) Engine=innodb default charset=utf8 

The COLLATE can be added on the whole table, i.e. every text column, e.g.

CREATE TABLE `DATA_USER_ROLE` (
  `ID` int(11) NOT NULL,
  `NAME` varchar(128) NOT NULL,
  `VAL_ID` int(11) NOT NULL,
  `CREATION_TIME` datetime NOT NULL,
  `ROLE_TYPE` int(11) NOT NULL,
  `STORAGE_TYPE` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `BV_AC_ROLE_KEY_IDX` (`NAME`,`VAL_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

This follows Monolune's recommendation for CHARSET and COLLATE from https://www.monolune.com/mysql-utf8-charsets-and-collations-explained/ and
https://www.monolune.com/what-is-the-utf8mb4_0900_ai_ci-collation/

These are the defauts since MySQL 8.0.1 .

Just use utf8_general_ci (case insensitive) charset by default for your db or only for one row, if you needed

受限制的 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 Case Insensitive but Accent Sensitive UTF8 Unique Key
    I know there are a lot of similar questions on SF, but I think mine is different enough to warrant a new question. I have a table that has a single column as utf8 with utf8_unicode_ci. It also has a unique key on this column along with another column marking a language code. The data in the column is in many different scripts (Latin with various accents, Chinese, and Russian, among others). The problem is that I will sometimes want to enter in two words with different meanings that only differ by a diacritic (i.e. Spanish ano vs año). Since utf8_unicode_ci is both case and accent insensitive
  • 不区分大小写的array_unique(case-insensitive array_unique)
    问题 我试图写几行代码以使不区分大小写的数组唯一类型函数。 这是我到目前为止的内容: foreach ($topics as $value) { $lvalue = strtolower($value); $uvalue = strtolower($value); if (in_array($value, $topics) == FALSE || in_array($lvalue, $topics) == FALSE || in_array($uvalue, $topics) == FALSE) { array_push($utopics, $value); } } 麻烦的是if语句。 我认为我的语法有问题,但是我对PHP还是比较陌生,我不确定它是什么。 有什么帮助吗? 回答1 function array_iunique( $array ) { return array_intersect_key( $array, array_unique( array_map( "strtolower", $array ) ) ); } 回答2 您要将lvalue和uvalue lvalue都设置为小写版本。 $uvalue = strtolower($value); 应该 $uvalue = strtoupper($value); 也就是说,这可能会更快一些。 您的函数的性能将呈指数级下降
  • 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
  • c# Dictionary: making the Key case-insensitive through declarations
    I have a Dictionary<string, object> dictionary. It used to be Dictionary<Guid, object> but other 'identifiers' have come into play and the Keys are now handled as strings. The issue is that the Guid keys from my source data are coming as VarChar, so now a key of "923D81A0-7B71-438d-8160-A524EA7EFA5E" is not the same as "923d81a0-7b71-438d-8160-a524ea7efa5e" (wasn't a problem when using Guids). What's really nice (and sweet) about the .NET framework is that I can do this: Dictionary<string, CustomClass> _recordSet = new Dictionary<string, CustomClass>( StringComparer.InvariantCultureIgnoreCase)
  • 如何在 SQLite 中创建不区分大小写的唯一列(How to make a case-insensitive unique column in SQLite)
    问题 我一直无法找到答案。 我正在尝试创建一个具有唯一电子邮件地址列的表。 当我这样做时 CREATE TABLE users ( email TEXT PRIMARY KEY, password TEXT NOT NULL CHECK(password<>''), UNIQUE (lower(email)) ) 使用 PDO 时,出现错误: 致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[HY000]:一般错误:1 靠近“(”:script.php 中的语法错误:65 堆栈跟踪:#0 script.php(65):PDO->exec ('CREATE TABLE us...') #1 {main} 在第 65 行的 script.php 中抛出 第 65 行是CREATE TABLE行。 如果我取出UNIQUE ,它工作正常。 有更好的方法吗? 回答1 COLLATE NOCASE 是您的朋友: CREATE TABLE users ( email TEXT PRIMARY KEY, password TEXT NOT NULL CHECK(password<>''), UNIQUE (email COLLATE NOCASE) ) 回答2 为了速度,首先将所有输入小写,并使用普通的唯一列。 这对于读取比写入更频繁的用例非常有用
  • C#中字符串键类型不区分大小写的字典(Case-INsensitive Dictionary with string key-type in C#)
    问题 如果我有Dictionary<String,...>是否可以使ContainsKey方法不区分大小写? 这似乎相关,但我不太了解:c#字典:通过声明使Key不区分大小写 回答1 这似乎相关,但我不太了解:c#字典:通过声明使Key不区分大小写 确实是有关的。 解决方案是告诉字典实例不要使用标准的字符串比较方法(区分大小写),而要使用不区分大小写的方法。 这是使用适当的构造函数完成的: var dict = new Dictionary<string, YourClass>( StringComparer.InvariantCultureIgnoreCase); 构造函数需要一个IEqualityComparer,它可以告诉字典如何比较键。 StringComparer.InvariantCultureIgnoreCase提供了一个IEqualityComparer实例,该实例以不区分大小写的方式比较字符串。 回答2 var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); myDic.Add("HeLlo", "hi"); if (myDic.ContainsKey("hello")) Console.WriteLine(myDic["hello"]); 回答3
  • 如何使Array.indexOf()不区分大小写?(How do I make Array.indexOf() case insensitive?)
    问题 我正在为一个网站编写一段代码,该网站将在数组中包含一个名称列表,并选择一个随机名称,我想添加一个功能,该功能使用户可以在数组中添加或删除名称。 我具有所有这些功能,但是删除名称时,用户必须键入名称以匹配数组中的Case。 我试图使它不区分大小写,我在做什么错呢? <html> <!--Other code uneeded for this question--> <p id="canidates"></p> <body> <input type="text" id="delname" /><button onclick="delName()">Remove Name from List</button> <script> //Array of names var names = []; //Other code uneeded for this question //List of Canidates document.getElementById('canidates').innerHTML = "<strong>List of Canidates:</strong> " + names.join(" | "); //Other code uneeded for this question //Remove name from Array function delName(
  • Is there any way to make a UNIQUE index case insensitive in Mysql 5.1.x ?
    If so - What must change in this table ? CREATE TABLE contestants ( idContestants int(10) unsigned NOT NULL AUTO_INCREMENT, idEvent int(10) unsigned NOT NULL, ContestantName varchar(50) DEFAULT NULL, PRIMARY KEY (idContestants), UNIQUE KEY Index_UniqueName (idEvent,ContestantName), ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
  • How to make a case-insensitive unique column in SQLite
    I haven't been able to find the answer to this. I'm trying to create a table with a unique email address column. And when I do CREATE TABLE users ( email TEXT PRIMARY KEY, password TEXT NOT NULL CHECK(password<>''), UNIQUE (lower(email)) ) when using PDO, I get the error: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1 near "(": syntax error' in script.php:65 Stack trace: #0 script.php(65): PDO->exec('CREATE TABLE us...') #1 {main} thrown in script.php on line 65 Line 65 is the CREATE TABLE line. If I take out the UNIQUE, it works fine. Is there a
  • PHP不区分大小写的单词替换(PHP Case Insensitive Word Replacement)
    问题 好的,我正在尝试在正在制作的此搜索脚本中将搜索词加粗,除非我无法使其不区分大小写。 function highlight($term,$target){ $terms = explode(" ", $term); foreach($terms as $term){ $result = (eregi_replace($term, "<strong>$term</strong>", $target)); } return $result; } 那就是我到目前为止所拥有的功能。在PHP.net上说eregi_replace是不区分大小写的匹配,但是由于某种原因,它显然不起作用。 (我是菜鸟)。 有任何想法吗? :D 回答1 从PHP 5.3开始不推荐使用ereg_* _ ereg_* (POSIX正则表达式)函数,并且很长时间以来都不建议使用。 最好使用PCRE( preg_* )函数(例如preg_replace)。 为此,您可以创建一个不区分大小写的正则表达式,然后将匹配项包装在<strong>标记中: function highlight($term, $target) { $terms = array_unique(explode(" ", $term)); // we only want to replace each term once foreach ($terms
  • 违反完整性约束:1062 utf8_unicode_ci 整理的重复条目(Integrity constraint violation: 1062 Duplicate entry for utf8_unicode_ci collation)
    问题 我有一个名为 tag 的表,在 name 列上有一个唯一约束: CREATE TABLE `tag` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `UNIQ_389B7835E237E06` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=13963 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 此表的排序规则是 utf8_unicode_ci。 当我尝试插入以下 2 个条目时,我收到“违反完整性约束”的执行。 SQL日志: 130607 14:35:53 1096 Connect imtpdb@localhost on imtpdb 1096 Query SET NAMES utf8 1096 Query START TRANSACTION 1096 Query INSERT INTO tag (name) VALUES ('até') 1096 Query INSERT INTO tag (name) VALUES ('ate') 1096 Query rollback 1096 Quit
  • Case-INsensitive Dictionary with string key-type in C#
    If I have a Dictionary<String,...> is it possible to make methods like ContainsKey case-insensitive? This seemed related, but I didn't understand it properly: c# Dictionary: making the Key case-insensitive through declarations
  • Django中的唯一模型字段和区分大小写(postgres)(Unique model field in Django and case sensitivity (postgres))
    问题 考虑以下情况:- 假设我的应用允许用户在其国家中创建州/省。 为了清楚起见,我们在这里仅考虑ASCII字符。 在美国,用户可以创建一个名为“德克萨斯州”的州。 如果该应用程序在内部使用,可以说用户不在意它是否拼写为“ texas”或“ Texas”或“ teXas” 但重要的是,如果数据库中已存在“德州”,则系统应阻止创建“德州”。 如果模型如下所示: class State(models.Model): name = models.CharField(max_length=50, unique=True) 在postgres中,唯一性将区分大小写; 也就是说,postgres将允许用户创建“德克萨斯州”和“德克萨斯州”,因为它们被认为是唯一的。 在这种情况下可以采取什么措施来防止这种行为。 如何使用Django和Postgres提供不区分大小写的唯一性 现在,我正在执行以下操作以防止创建不区分大小写的重复项。 class CreateStateForm(forms.ModelForm): def clean_name(self): name = self.cleaned_data['name'] try: State.objects.get(name__iexact=name) except ObjectDoesNotExist: return name raise
  • 查询字符串键是否区分大小写?(Are query string keys case sensitive?)
    问题 假设我有一个这样的网址: http://www.example.com?key=123&KEY=198 那会是什么结果 request.querystring("key") and request.querystring("KEY") 我有点困惑。 回答1 URI的RFC表示: 6.2.2.1。 案例规范化当URI使用通用语法的组件时,始终会应用组件语法等效规则。 也就是说,方案和主机不区分大小写,因此应规范化为小写。 例如,URI等效于http://www.example.com/。 除非该方案另有明确定义,否则其他通用语法组件均假定为区分大小写的(请参见第6.2.3节)。 请注意,方案(此处为“ http”),主机(服务器名称)不区分大小写,但无论如何都应小写。 其余的区分大小写,除非您使用不同的方案明确表明它应该不区分大小写。 因此,根据规范,在所有基于http的URI中,key和KEY是不同的东西。 编辑:@Nicholas在假设权限定义了它接受的内容方面是部分错误的,这对于定义自己的URI的自定义方案和权限来说是正确的,但是http是每个人都遵循的定义明确的规范(或者您可以使用http查询例如,用竖线字符作为分隔符。想象一下那里的混乱!) HTTP的RFC规范说: 方案和主机不区分大小写,通常以小写形式提供; 所有其他组件都以区分大小写的方式进行比较。 除“保留
  • 不区分大小写的字典搜索? [复制](Case insensitive dictionary search? [duplicate])
    问题 这个问题在这里已经有了答案: 不区分大小写的字典(10 个回答) 3年前关闭。 我可以使用 map 用 Python 实现不区分大小写的列表搜索。 a = ['xyz', 'wMa', 'Pma']; b = map(string.lower, a) if 'Xyz'.lower() in b: print 'yes' 我怎样才能用字典做同样的事情? 我尝试了以下代码,但 ap 具有 ['a','b','c'] 列表,而不是不区分大小写的字典。 a = {'a':1, 'B':2, 'c':3} ap = map(string.lower, a) 回答1 请注意,使字典不区分大小写,无论如何都可能会丢失信息:例如,您将如何“不区分大小写” {'a': 23, 'A': 45} ?! 如果你只关心一个键在字典中的位置(即,不关心它对应的值是什么),那么创建一个set ——即 theset = set(k.lower() for k in thedict) (在 Python 的每个版本中,或者{k.lower() for k in thedict}如果你对你的代码只在 Python 2.7 或更高版本中工作感到满意,为了一些纯粹的装饰性语法糖;-),并检查if k.lower() in theset: ... 。 或者,您可以创建一个包装类,例如,可能是只读的...:
  • 可延迟,不区分大小写的唯一约束(Deferrable, case-insensitive unique constraint)
    问题 在PostgreSQL中是否可以在字符列上创建可延迟的唯一约束,但不区分大小写? 让我们假设下面的基本表: CREATE TABLE sample_table ( my_column VARCHAR(100) ); 如果不需要可延迟的约束,则就像使用函数创建唯一索引一样简单,例如: CREATE UNIQUE INDEX my_unique_index ON sample_table(UPPER(my_column)); 延迟约束检查需要显式创建约束,例如: ALTER TABLE sample_table ADD CONSTRAINT my_unique_constraint UNIQUE(my_column) DEFERRABLE INITIALLY IMMEDIATE; 不幸的是,不可能在唯一约束中使用任意函数。 一种可能的解决方法是创建与my_column内容相同的其他列,但大写形式在每次更新/插入后通过触发器进行更新,然后在此人工列上创建可延迟的唯一约束。 但是,这听起来确实很丑陋。 或者,应该可以使用CREATE CONSTRAINT TRIGGER并手动检查不区分大小写的唯一性(当然,仍然需要常规索引)。 对于这样一个简单的需求(我想很受欢迎),这听起来有些复杂。 有没有更简单和/或更优雅的方法来解决此限制? 回答1
  • 发电机数据库中不区分大小写的查询(case insensitive query in dynamo DB)
    问题 我想扫描/查询 dynamo DB 表。 Dynamo DB 区分大小写。 我有时想使用 Hash/Range 键作为字符串。 有什么方法可以在 dynamo DB 级别启用不区分大小写? 或者是否存在其他解决方案? 我正在使用 JAVA SDK 查询 Dynamo 回答1 我能想到两种可能的方法 1)通过调整架构在应用程序端解决 例如,假设您现在将“名称”作为散列键,每当添加新用户时,您在将他们的名字设为小写后添加他们 John --> john Doe --> doe 请记住同时存储值( name作为哈希用于搜索)和(用于显示目的的displayName ) 现在在查询数据库之前,您可以将搜索转换为小写。 2) 使用 ElasticSearch: DyanmoDB 表可以与 ElasticSearch 集成,ElasticSearch 可以对您的表执行不同的搜索操作(参考链接) 回答2 正如其他答案所提到的,ElasticSearch 似乎是一个不错的选择。 但是当我遇到类似的情况时,我是这样解决的。 我创建了一个仅用于搜索的新属性。 我将要搜索的值以小写形式存储在此属性中,并通过使用“CONTAINS”运算符进行查询来进行搜索。 例如。 如果我有一个项目如下: id: 1 username: 'fsmith' first_name: 'Franco' last_name
  • Deferrable, case-insensitive unique constraint
    Is it possible in PostgreSQL to create a deferrable unique constraint on a character column, but case-insensitive? Let's assume the following basic table: CREATE TABLE sample_table ( my_column VARCHAR(100) ); If deferrable constraint is not needed, it is as simple as creating unique index with function, e.g.: CREATE UNIQUE INDEX my_unique_index ON sample_table(UPPER(my_column)); Deferred constraint check requires creating the constraint explicitly, e.g.: ALTER TABLE sample_table ADD CONSTRAINT my_unique_constraint UNIQUE(my_column) DEFERRABLE INITIALLY IMMEDIATE; And unfortunately it is not
  • 数据库不区分大小写索引?(Database Case Insensitive Index?)
    问题 我有一个查询,我正在搜索一个字符串: SELECT county FROM city WHERE UPPER(name) = 'SAN FRANCISCO'; 现在,这工作正常,但不能很好地扩展,我需要对其进行优化。 我已经找到了一个创建生成视图的选项,或者类似的东西,但我希望有一个使用索引的更简单的解决方案。 我们正在使用 DB2,我真的想在索引中使用一个表达式,但是这个选项似乎只在 z/OS 上可用,但是我们运行的是 Linux。 无论如何,我尝试了表达式索引: CREATE INDEX city_upper_name_idx ON city UPPER(name) ALLOW REVERSE SCANS; 但当然,它会在 UPPER(名称)上窒息。 有没有另一种方法可以以这种方式创建索引或类似的东西,这样我就不必重组现有查询以使用新生成的视图,或更改现有列,或任何其他此类侵入性更改? 编辑:我愿意听取其他数据库的解决方案......它可能会延续到 DB2...... 回答1 您可以添加一个索引列,其中包含城市名称的数字哈希键。 (允许重复)。 然后你可以做一个多条款,其中: hash = [compute hash key for 'SAN FRANCISCO'] SELECT county FROM city WHERE cityHash = hash AND
  • PHP不区分大小写的in_array函数(PHP case-insensitive in_array function)
    问题 使用in_array函数时是否可以进行不区分大小写的比较? 因此,使用这样的源数组: $a= array( 'one', 'two', 'three', 'four' ); 以下查找将全部返回true: in_array('one', $a); in_array('two', $a); in_array('ONE', $a); in_array('fOUr', $a); 哪些功能或一组功能会做同样的事情? 我不认为in_array本身可以做到这一点。 回答1 您可以使用preg_grep(): $a= array( 'one', 'two', 'three', 'four' ); print_r( preg_grep( "/ONe/i" , $a ) ); 回答2 显而易见的事情是将搜索词转换为小写: if (in_array(strtolower($word), $array)) { ... 当然,如果数组中有大写字母,则需要先执行以下操作: $search_array = array_map('strtolower', $array); 并搜索。 每次搜索都对整个数组执行strtolower毫无意义。 但是搜索数组是线性的。 如果你有一个大的数组或你打算这样做了很多,这将是更好地把搜索条件在阵列的关键,因为这将是更快的访问: $search_array = array