天道酬勤,学无止境

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;

评论

If you mean case sensitive then:

ALTER TABLE `contestants` CHANGE `ContestantName` `ContestantName` VARCHAR( 50 )
CHARACTER SET latin1 COLLATE latin1_bin NULL DEFAULT NULL 

If you mean case insensitive then:

ALTER TABLE `contestants` CHANGE `ContestantName` `ContestantName` VARCHAR( 50 )
CHARACTER SET latin1 COLLATE latin1_general_ci NULL DEFAULT NULL 

For table level do (for case insensitive):

ALTER TABLE `contestants` DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci

Note that table level only affects new columns.

For database level do (for case insensitive):

ALTER DATABASE `database_name` CHARACTER SET latin1 COLLATE latin1_general_ci

Note that database level only affect new tables.

Yes, use a case-insensitive collation on the columns involved.

MySQL Manual :: Column Character Set and Collation

This worked for me in Mysql 5.5

ALTER TABLE `contestants` MODIFY
`ContestantName` VARCHAR(50) 
CHARACTER SET latin1
COLLATE latin1_bin;

受限制的 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中大小写问题
    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
  • 如何为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中
  • 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
  • 检查字段是否包含字符串(Checking if a field contains a string)
    问题 我正在寻找一个运算符,该运算符可以让我检查字段的值是否包含某个字符串。 就像是: db.users.findOne({$contains:{"username":"son"}}) 那可能吗? 回答1 您可以使用以下代码来实现。 db.users.findOne({"username" : {$regex : ".*son.*"}}); 回答2 由于Mongo Shell支持正则表达式,因此这是完全可能的。 db.users.findOne({"username" : /.*son.*/}); 如果我们希望查询不区分大小写,则可以使用“ i”选项,如下所示: db.users.findOne({"username" : /.*son.*/i}); 请参阅:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions 回答3 https://docs.mongodb.com/manual/reference/sql-comparison/ http://php.net/manual/en/mongo.sqltomongo.php 的MySQL SELECT * FROM users WHERE username LIKE "%Son%" MongoDB的 db
  • Django的大小写不敏感网址?(Case insensitive urls for Django?)
    问题 默认情况下,django的url解算器似乎执行区分大小写的搜索来解析url,并区分'/ Login'和'login'。 我的网址格式如下。 urlpatterns = patterns('', (r'^admin/(.*)', admin.site.root), (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_DOC_ROOT, 'show_indexes': True}), (r'^login/$', 'django.contrib.auth.views.login'), (r'^logout/$', do_logout), ) 谁能指导我,如何使Django URL不区分大小写? 回答1 只需将(?i)放在每个r'...'字符串的开头,即: urlpatterns = patterns('', (r'^(?i)admin/(.*)', admin.site.root), (r'^(?i)static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_DOC_ROOT, 'show_indexes': True}), (r'^(?i
  • 如何在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的一些高级特性(读书笔记)
    分区表 对用户来说,分区表是一个独立的逻辑表,但是底层是由多个物理子表组成。 MySQL实现分区表的方式:对底层表的封装。 意味着索引也是按照分区的子表定义的,没有全局索引。 这和Oracle不同,Oracle可以更加灵活的定义索引和表是否分区。 MySQL在创建表时使用 PARTITION BY 子句定义每个分区存放的数据。 执行查询时,优化器会根据分区定义过滤掉不需要查询的分区,这样就无需扫描所有分区了,只需要扫描包含数据的分区。 分区的一个主要目的:将数据按照一个粗的粒度分散到多个表中。 分区的作用: 表非常大以至于无法全部加载到内存中,或者只在表的最后部分有热点数据,其他均为历史数据。分区表的数据更容易维护。例如要批量删除大量数据可以直接清除整个分区,还可以对单个分区进行优化。分区表的数据可以分布在不同的物理设备上。可以使用分区表来避免某些特殊的瓶颈,例如ext3文件系统的InnoDB锁竞争等。可以备份和恢复单独的区,在超大数据量下效果很好。 分区表的限制: 一个表最多只能有1024个分区。MySQL5.1中,分区表达式必须是整数或返回整数的函数。MySQL5.5中,可以使用列来分区。如果分区字段中有主键或唯一索引的列,那么所有的主键列和唯一索引列必须包含进来。分区表无法使用外键约束。 分区表的原理 分区表由多个相关的底层表实现,这些底层表也是由句柄对象(Handler
  • MySQL 表名忽略大小写问题记录
    问题描述:一开发同事在linux下调一个程序老是报错说找不到表,但是登陆mysql,show tables查看明明是已经创建了这张表的!!如下:mysql> show tables; +-------------------------------------------+ | Tables_in_huan_db | +-------------------------------------------+ | advertisement | | message_queue | | message_sys_user | | message_user | | opHistory | | opHistory_queue | | opHistory_queue_result_log | | opHistory_queue_send_fail_log | +-------------------------------------------+ 8 rows in set (0.00 sec) mysql> desc opHistory; ERROR 1146 (42S02): Table 'haun_db.opHistory' doesn't exist mysql> desc opHistory_queue; ERROR 1146 (42S02): Table 'haun_db
  • URL是否应区分大小写?(Should URL be case sensitive?)
    问题 我注意到 HTTP://STACKOVERFLOW.COM/QUESTIONS/ASK 和 http://stackoverflow.com/questions/ask 两者都可以正常工作-实际上前一个被转换为小写。 我认为这对用户有意义。 如果我查看Google,那么此URL可以正常工作: http://www.google.com/intl/en/about/corporate/index.html 但是这个带有“ ABOUT”的按钮不起作用: http://www.google.com/intl/en/ABOUT/corporate/index.html URL是否应区分大小写? 回答1 根据W3的“ HTML和URL”,他们应该: 可能存在URL或部分URL,大小写无关紧要,但是识别这些URL可能并不容易。 用户应始终认为URL区分大小写。 回答2 所有“不敏感的”均以粗体显示,以提高可读性。 根据RFC 4343,域名不区分大小写。其余URL通过GET方法发送到服务器。 这是否区分大小写。 以此页面为例,stackoverflow.com接收GET字符串/ questions / 7996919 / should-url-区分大小写,将HTML文档发送到您的浏览器。 Stackoverflow.com不区分大小写,因为它对/ QUEStions / 7996919
  • 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
  • lighttpd + mysql + php(fast-cgi)安装与配置详解
    fast_cgi模块详解nginx–location语法规则: location [=||*|^~] /uri/ { … } = 开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。开头表示区分大小写的正则匹配~* 开头表示不区分大小写的正则匹配!和!*分别为区分大小写不匹配及不区分大小写不匹配 的正则/ 通用匹配,任何请求都会匹配到。多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。例子,有如下匹配规则:location = / { #规则A } location = /login { #规则B } location ^~ /static/ { #规则C } location ~ .(gif|jpg|png|js|css)$ { #规则D } location ~* .png$ { #规则E } location !~ .xhtml$ { #规则F } location !~* .xhtml$ { #规则G }
  • Case-insensitive unique index in Rails/ActiveRecord?
    I need to create a case-insensitive index on a column in rails. I did this via SQL: execute( "CREATE UNIQUE INDEX index_users_on_lower_email_index ON users (lower(email))" ) This works great, but in my schema.rb file I have: add_index "users", [nil], :name => "index_users_on_lower_email_index", :unique => true Notice the "nil". So when I try to clone the database to run a test, I get an obvious error. Am I doing something wrong here? Is there some other convention that I should be using inside rails? Thanks for the help.
  • 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行。
  • Shell脚本中字符串的大小写不敏感比较(Case insensitive comparison of strings in shell script)
    问题 ==运算符用于比较Shell脚本中的两个字符串。 但是,我想比较两个字符串而忽略大小写,该怎么办? 为此有任何标准命令吗? 回答1 如果你有重击 str1="MATCH" str2="match" shopt -s nocasematch case "$str1" in $str2 ) echo "match";; *) echo "no match";; esac 否则,您应该告诉我们您使用的是什么shell。 或者,使用awk str1="MATCH" str2="match" awk -vs1="$str1" -vs2="$str2" 'BEGIN { if ( tolower(s1) == tolower(s2) ){ print "match" } }' 回答2 在Bash中,您可以使用参数扩展将字符串修改为全部小写/大写: var1=TesT var2=tEst echo ${var1,,} ${var2,,} echo ${var1^^} ${var2^^} 回答3 所有这些答案都忽略了最简单,最快捷的方法(只要您具有Bash 4): if [ "${var1,,}" = "${var2,,}" ]; then echo ":)" fi 您要做的就是将两个字符串都转换为小写并比较结果。 回答4 保存nocasematch的状态(以防其他功能取决于它的禁用状态):
  • MySQL-一对一关系?(MySQL - One To One Relationship?)
    问题 我正在尝试在MySQL数据库中实现“一对一”的关系。 例如,假设我有一个Users表和一个Accounts表。 我想确保一个用户只能拥有一个帐户。 每个用户只能有一个帐户。 我找到了两个解决方案,但是不知道该使用什么,还有其他选择。 第一个解决方案: DROP DATABASE IF EXISTS test; CREATE DATABASE test CHARSET = utf8 COLLATE = utf8_general_ci; USE test; CREATE TABLE users( id INT NOT NULL AUTO_INCREMENT, user_name VARCHAR(45) NOT NULL, PRIMARY KEY(id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; CREATE TABLE accounts( id INT NOT NULL AUTO_INCREMENT, account_name VARCHAR(45) NOT NULL, user_id INT UNIQUE, PRIMARY KEY(id), FOREIGN KEY(user_id) REFERENCES users(id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; 在此示例中
  • How to change MySQL table names in Linux server to be case insensitive?
    I'm working on an old website that used to be hosted on an Apple server. When it was migrated into a new Linux server it stopped working. I'm pretty sure it's because all the MySQL queries used in the php scripts have different case combinations for the table names (I don't know why the original developers didn't follow any conventions when they created the table names or the php scripts) and it didn't matter because both Mac and Windows MySQL servers are case insensitive by default when it comes to this. However, Linux is not. Is there a way to change the Linux default on MySQL so it becomes
  • 不区分大小写的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); 也就是说,这可能会更快一些。 您的函数的性能将呈指数级下降
  • gql查询StringProperty中不区分大小写的where子句(Case insensitive where clause in gql query for StringProperty)
    问题 使用google appengine数据存储区,有没有一种方法可以执行gql查询,该查询在不区分大小写的StringProperty数据类型上指定WHERE子句? 我不总是知道值的大小写。文档指定where对我的值区分大小写,是否有办法使此值不敏感? 例如,数据库模型将是这样的: from google.appengine.ext import db class Product(db.Model): id = db.IntegerProperty() category = db.StringProperty() 数据看起来像这样: id category =================== 1 cat1 2 cat2 3 Cat1 4 CAT1 5 CAT3 6 Cat4 7 CaT1 8 CAT5 我想说 gqlstring = "WHERE category = '{0}'".format('cat1') returnvalue = Product.gql(gqlstring) 并具有returnvalue包含 id category =================== 1 cat1 3 Cat1 4 CAT1 7 CaT1 回答1 我认为数据存储区中没有像这样的运算符。 您是否控制类别数据的输入? 如果是这样,您应该选择一种规范形式来存储它(全部小写或全部大写)
  • 如何在不违反唯一约束的情况下在MySQL中交换两行的值?(How to swap values of two rows in MySQL without violating unique constraint?)
    问题 我有一个带有优先级列的“任务”表,该表具有唯一的约束。 我试图交换两行的优先级值,但我一直违反约束。 我在类似情况下的某个地方看到了该语句,但MySQL却没有。 UPDATE tasks SET priority = CASE WHEN priority=2 THEN 3 WHEN priority=3 THEN 2 END WHERE priority IN (2,3); 这将导致错误: Error Code: 1062. Duplicate entry '3' for key 'priority_UNIQUE' 是否可以在MySQL中完成此操作而不使用伪造的值和多个查询? 编辑: 这是表的结构: CREATE TABLE `tasks` ( `id` int(11) NOT NULL, `name` varchar(200) DEFAULT NULL, `priority` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `priority_UNIQUE` (`priority`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 回答1 是否可以在MySQL中完成此操作而不使用伪造的值和多个查询? 不(我想不到的)。 问题是MySQL如何处理更新。 MySQL
  • case-insensitive array_unique
    I'm trying to write a few lines of code to make a case insensitive array unique type function. Here's what I have so far: 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); } } The trouble is the if statement. I think there's something wrong with my syntax, but I'm relatively new to PHP and I'm not sure what it is. Any help?